0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

遞歸代碼都轉(zhuǎn)為非遞歸可以嗎

jf_78858299 ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2023-02-17 14:35 ? 次閱讀

先說答案,這是肯定的,所有遞歸代碼都可以轉(zhuǎn)為非遞歸代碼。

之所以所有的遞歸都能轉(zhuǎn)為迭代算法是因?yàn)檫f歸借助函數(shù)調(diào)用,函數(shù)調(diào)用本身就是基于調(diào)用棧這種結(jié)構(gòu)實(shí)現(xiàn)的,只不過這一切都是自動(dòng)完成的,我們當(dāng)然也可以用代碼手動(dòng)模擬出來。

圖片

我們知道將遞歸調(diào)用全部展開后其實(shí)會形成一棵樹,把遞歸轉(zhuǎn)為非遞歸無非就是在遍歷這棵樹,那么遍歷樹就有很多技術(shù)了,基于棧的深度優(yōu)先遍歷Depth-first traversal,或者基于隊(duì)列的廣度優(yōu)先遍歷breadth-first traversal都是可以的:

圖片

說會遞歸轉(zhuǎn)為非遞歸這個(gè)話題,更理論一些的解釋是這樣的,不管是遞歸還是非遞歸,這兩者都是圖靈完備的,既然是圖靈完備,那么它們在表達(dá)能力上就是等價(jià)的,不存在誰不能轉(zhuǎn)為誰的問題。

只不過這存在一個(gè)難易程度的問題。

大家都知道尾遞歸最容易轉(zhuǎn)為非遞歸的迭代形式,本質(zhì)上是這棵樹不是多叉的而是單叉的,單叉的不就退化成鏈表了嘛,遍歷鏈表當(dāng)然是簡單的,但如果是多叉的話問題就沒那么簡單了, 這里最有趣的是不存在一種模板可以讓我們直接用套路的形式把遞歸轉(zhuǎn)為非遞歸 ,因此這里存在一個(gè)問題:為什么你要把遞歸轉(zhuǎn)為非遞歸呢?因?yàn)樽罱K你會發(fā)現(xiàn)將遞歸轉(zhuǎn)為非遞歸無非就是你自己接手了編譯器本來已經(jīng)替你完成的工作, 你會發(fā)現(xiàn)自己在手動(dòng)模擬函數(shù)調(diào)用

圖片

遞歸的優(yōu)勢很明顯:代碼簡潔,容易理解和維護(hù),其為人詬病的地方在于執(zhí)行效率“可能”沒有非遞歸版本的高,但你最好理解這句話到底在說什么,到底哪里效率就不高了?

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 結(jié)構(gòu)
    +關(guān)注

    關(guān)注

    1

    文章

    117

    瀏覽量

    21549
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4260

    瀏覽量

    62228
  • 遞歸
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    8999
收藏 人收藏

    評論

    相關(guān)推薦

    labview中遞歸使用你嘗試過嗎?

    關(guān)于遞歸,或許在labview中很少聽過或者使用,不過了解下,算是一種娛樂吧,labview是確實(shí)支持遞歸的關(guān)于遞歸一個(gè)可以調(diào)用自己的VI就叫做遞歸
    發(fā)表于 01-05 15:07

    《C Primer Plus》讀書筆記——遞歸

    ("LEVEL %d: n location %p\n" , n, &n);}輸出如下:遞歸的基本原理每級遞歸都使用其私有變量(如例子中的n)每次函數(shù)調(diào)用返回前一級(調(diào)用他那級
    發(fā)表于 02-05 20:06

    三個(gè)水桶等分8升水問題---用LabVIEW遞歸解題

    可以用循環(huán)替代,但遞歸這種思想符合人類思考問題的方式。在很多問題中,采用遞歸可以大大提高代碼的可讀性,而且編程容易實(shí)現(xiàn)。而這時(shí)如若非要才要循
    發(fā)表于 02-14 22:06

    LabVIEW遞歸

    我的上一遍主題寫了“三個(gè)水桶等分8升水問題”,在其中提到了遞歸的重要性以及LabVIEW如何設(shè)置VI才能使得該VI可以實(shí)現(xiàn)遞歸調(diào)用。而最近看了下《算法的樂趣》中,看到愛因斯坦問題這一章之后,更是讓我
    發(fā)表于 02-19 11:52

    LabVIEW中的遞歸調(diào)用

    一.NI提供的遞歸調(diào)用使用的步驟如下1.將VI設(shè)置成重載模式2.使用靜態(tài)調(diào)用調(diào)用調(diào)用VI,實(shí)現(xiàn)自身調(diào)用看見下圖NI自帶遞歸方法二、如果將靜態(tài)調(diào)用改成直接調(diào)用自身也可得到相同的結(jié)果,而且程序更直
    發(fā)表于 05-18 10:36

    Labview遞歸函數(shù)的使用案例

    Labview遞歸函數(shù)的使用案例,簡單的1+2+3...+100求和,簡單易懂,充分理解遞歸函數(shù)的思想
    發(fā)表于 10-09 09:37

    LabVIEW中使用遞歸算法

    LabVIEW中使用遞歸算法LabVIEW支持遞歸嗎?如何在LabVIEW中創(chuàng)建遞歸的VI?LabVIEW確實(shí)支持遞歸。按照下面的步驟來創(chuàng)建一個(gè)遞歸
    發(fā)表于 04-17 20:11

    遞歸算法的設(shè)計(jì)模式與調(diào)試

    文中提出一種通用遞歸算法的設(shè)計(jì)模式,并結(jié)合實(shí)例說明該模式的應(yīng)用方法和有效性,為研究遞歸算法提供了有效的解決方案,可推廣性強(qiáng)。同時(shí)給出了遞歸程序在調(diào)試過程中的一些方法和
    發(fā)表于 11-03 15:04 ?24次下載

    Labview初級教程之遞歸與可重入VI的詳細(xì)資料說明

    LabVIEW中使用遞歸調(diào)用不是很方便。并且遞歸并不是編程必須程序結(jié)構(gòu),任何需要使用遞歸調(diào)用的地方,都可以用循環(huán)結(jié)構(gòu)來代替。但是在某些情況下,使用
    發(fā)表于 03-25 16:39 ?2次下載
    Labview初級教程之<b class='flag-5'>遞歸</b>與可重入VI的詳細(xì)資料說明

    所有遞歸代碼可以轉(zhuǎn)為遞歸代碼

    之所以所有的遞歸都能轉(zhuǎn)為迭代算法是因?yàn)?b class='flag-5'>遞歸借助函數(shù)調(diào)用,函數(shù)調(diào)用本身就是基于調(diào)用棧這種結(jié)構(gòu)實(shí)現(xiàn)的,只不過這一切都是自動(dòng)完成的,我們當(dāng)然也可以代碼
    的頭像 發(fā)表于 04-19 15:02 ?1991次閱讀

    如何求遞歸算法的時(shí)間復(fù)雜度

    那么我通過一道簡單的面試題,模擬面試的場景,來帶大家逐步分析遞歸算法的時(shí)間復(fù)雜度,最后找出最優(yōu)解,來看看同樣是遞歸,怎么就寫成了O(n)的代碼。
    的頭像 發(fā)表于 07-13 11:30 ?2210次閱讀

    Python支持遞歸函數(shù)

    Python支持遞歸函數(shù)——即直接或間接地調(diào)用自身以進(jìn)行循環(huán)的函數(shù)。遞歸是頗為高級的話題,并且它在Python中相對少見。然而,它是一項(xiàng)應(yīng)該了解的有用的技術(shù),因?yàn)樗试S程序遍歷擁有任意的、不可預(yù)知的形狀的結(jié)構(gòu)。遞歸甚至是簡單循環(huán)
    的頭像 發(fā)表于 02-21 14:28 ?601次閱讀

    函數(shù)與遞歸-3

    與原問題相似的規(guī)模較小的問題來解決,遞歸策略只需少量的程序就可描述出解題過程所需的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。
    的頭像 發(fā)表于 02-21 15:57 ?533次閱讀

    C語言,你真的懂遞歸了嗎?

    要說到遞歸如果不說棧的話,我覺得有點(diǎn)不合適,遞歸特點(diǎn)就是不斷的調(diào)用同一個(gè)函數(shù),如果這個(gè)函數(shù)沒有一個(gè)遞歸界限,那么就是死循環(huán)了,所以討論遞歸,就必須要討論
    的頭像 發(fā)表于 06-06 15:24 ?928次閱讀
    C語言,你真的懂<b class='flag-5'>遞歸</b>了嗎?

    Python遞歸的經(jīng)典案例

    當(dāng)我們碰到諸如需要求階乘或斐波那契數(shù)列的問題時(shí),使用普通的循環(huán)往往比較麻煩,但如果我們使用遞歸時(shí),會簡單許多,起到事半功倍的效果。這篇文章主要和大家分享一些和遞歸有關(guān)的經(jīng)典案例,結(jié)合一些資料談一下個(gè)人的理解,也借此加深自己對遞歸
    的頭像 發(fā)表于 08-05 15:57 ?250次閱讀