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

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

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

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

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:碼農(nóng)的荒島求生 ? 作者:碼農(nóng)的荒島求生 ? 2022-04-19 15:02 ? 次閱讀

先說答案,這是肯定的,所有遞歸代碼都可以轉(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)模擬出來。

60f64680-bf93-11ec-9e50-dac502259ad0.png

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

610cf696-bf93-11ec-9e50-dac502259ad0.png

哦對(duì)了,說到算法,大家趕緊去關(guān)注小風(fēng)哥的算法號(hào),這個(gè)公眾號(hào)也是我親手寫的,只不過數(shù)據(jù)結(jié)構(gòu)與算法這個(gè)話題有點(diǎn)宏大因此特意開了新號(hào),大家快去關(guān)注吧。 說會(huì)遞歸轉(zhuǎn)為非遞歸這個(gè)話題,更理論一些的解釋是這樣的,不管是遞歸還是非遞歸,這兩者都是圖靈完備的,既然是圖靈完備,那么它們?cè)诒磉_(dá)能力上就是等價(jià)的,不存在誰不能轉(zhuǎn)為誰的問題。關(guān)于圖靈完備參考這篇《計(jì)算機(jī)科學(xué)中那些有趣的事實(shí)》。 只不過這存在一個(gè)難易程度的問題。 大家都知道尾遞歸最容易轉(zhuǎn)為非遞歸的迭代形式,本質(zhì)上是這棵樹不是多叉的而是單叉的,單叉的不就退化成鏈表了嘛,遍歷鏈表當(dāng)然是簡(jiǎn)單的,但如果是多叉的話問題就沒那么簡(jiǎn)單了,這里最有趣的是不存在一種模板可以讓我們直接用套路的形式把遞歸轉(zhuǎn)為非遞歸,因此這里存在一個(gè)問題:為什么你要把遞歸轉(zhuǎn)為非遞歸呢?因?yàn)樽罱K你會(huì)發(fā)現(xiàn)將遞歸轉(zhuǎn)為非遞歸無非就是你自己接手了編譯器本來已經(jīng)替你完成的工作,你會(huì)發(fā)現(xiàn)自己在手動(dòng)模擬函數(shù)調(diào)用。

61368826-bf93-11ec-9e50-dac502259ad0.png

遞歸的優(yōu)勢(shì)很明顯:代碼簡(jiǎn)潔,容易理解和維護(hù),其為人詬病的地方在于執(zhí)行效率“可能”沒有非遞歸版本的高,但你最好理解這句話到底在說什么,到底哪里效率就不高了? 我們知道函數(shù)調(diào)用本身并不是免費(fèi)的,函數(shù)調(diào)用也是有代價(jià)的,這里的代價(jià)就在于維護(hù)函數(shù)調(diào)用以及函數(shù)返回需要額外執(zhí)行一些指令,關(guān)于這部分的內(nèi)容可以參考《函數(shù)調(diào)用時(shí)底層發(fā)生了什么?》,同時(shí)棧區(qū)空間有限,因此如果你的遞歸調(diào)用層級(jí)太多的話可能會(huì)導(dǎo)致棧溢出,撐爆你的運(yùn)行時(shí)環(huán)境以及可能存在重復(fù)計(jì)算問題(可以利用memory table解決),除此之外除非你有絕對(duì)令人信服的理由,否則你不應(yīng)該試圖將遞歸轉(zhuǎn)為非遞歸。

審核編輯 :李倩

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

    關(guān)注

    3

    文章

    4284

    瀏覽量

    62328
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4723

    瀏覽量

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    9003

原文標(biāo)題:遞歸代碼都可以轉(zhuǎn)為非遞歸嗎 ?

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    遞歸神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)的模型結(jié)構(gòu)

    遞歸神經(jīng)網(wǎng)絡(luò)是一種旨在處理分層結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),使其特別適合涉及樹狀或嵌套數(shù)據(jù)的任務(wù)。這些網(wǎng)絡(luò)明確地模擬了層次結(jié)構(gòu)中的關(guān)系和依賴關(guān)系,例如語言中的句法結(jié)構(gòu)或圖像中的層次表示。它使用遞歸操作來分層處理信息,有效地捕獲上下文信息。
    的頭像 發(fā)表于 07-10 17:21 ?495次閱讀
    <b class='flag-5'>遞歸</b>神經(jīng)網(wǎng)絡(luò)和循環(huán)神經(jīng)網(wǎng)絡(luò)的模型結(jié)構(gòu)

    遞歸神經(jīng)網(wǎng)絡(luò)的實(shí)現(xiàn)方法

    遞歸神經(jīng)網(wǎng)絡(luò)(Recursive Neural Network,簡(jiǎn)稱RNN)是一種特殊類型的神經(jīng)網(wǎng)絡(luò),其特點(diǎn)在于能夠處理具有層次或樹狀結(jié)構(gòu)的數(shù)據(jù),并通過遞歸的方式對(duì)這些數(shù)據(jù)進(jìn)行建模。與循環(huán)神經(jīng)網(wǎng)絡(luò)
    的頭像 發(fā)表于 07-10 17:02 ?261次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)形式主要分為

    遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Networks,簡(jiǎn)稱RNN)是一種具有時(shí)間序列處理能力的神經(jīng)網(wǎng)絡(luò),其結(jié)構(gòu)形式多樣,可以根據(jù)不同的需求進(jìn)行選擇和設(shè)計(jì)。本文將介紹遞歸神經(jīng)網(wǎng)絡(luò)的幾種主要
    的頭像 發(fā)表于 07-05 09:32 ?437次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)與循環(huán)神經(jīng)網(wǎng)絡(luò)一樣嗎

    遞歸神經(jīng)網(wǎng)絡(luò)(Recursive Neural Network,RvNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,RNN)是兩種不同類型的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),它們?cè)谔幚硇蛄袛?shù)據(jù)
    的頭像 發(fā)表于 07-05 09:28 ?629次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)主要應(yīng)用于哪種類型數(shù)據(jù)

    處理(NLP) 自然語言處理是遞歸神經(jīng)網(wǎng)絡(luò)最重要的應(yīng)用領(lǐng)域之一。在NLP中,遞歸神經(jīng)網(wǎng)絡(luò)可以用于以下任務(wù): 1.1 語言模型(Language Modeling) 語言模型是預(yù)測(cè)給定詞序列中下一個(gè)詞的概率分布。
    的頭像 發(fā)表于 07-04 14:58 ?494次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)是循環(huán)神經(jīng)網(wǎng)絡(luò)嗎

    遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,簡(jiǎn)稱RNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Network,簡(jiǎn)稱RNN)實(shí)際上是同一個(gè)概念,只是不同的翻譯方式
    的頭像 發(fā)表于 07-04 14:54 ?596次閱讀

    遞歸神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)、特點(diǎn)、優(yōu)缺點(diǎn)及適用場(chǎng)景

    遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent Neural Networks,簡(jiǎn)稱RNN)是一種具有循環(huán)結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò),其核心特點(diǎn)是能夠處理序列數(shù)據(jù),并對(duì)序列中的信息進(jìn)行記憶和傳遞。RNN在自然語言處理、語音
    的頭像 發(fā)表于 07-04 14:52 ?998次閱讀

    關(guān)于C語言中的遞歸

    遞歸指的是在函數(shù)的定義中使用函數(shù)自身的方法。
    發(fā)表于 02-26 10:34 ?321次閱讀
    關(guān)于C語言中的<b class='flag-5'>遞歸</b>

    榮小菜補(bǔ)鈣記第61期_LabVIEW之遞歸文件及文件夾

    靈活使用。 3. 遍歷全部層級(jí)文件及文件夾_Demo 利用“羅列文件夾”函數(shù),通過編寫一定的邏輯,可以實(shí)現(xiàn)返回全部層級(jí)的文件及文件夾。代碼如下?;具壿嬍潜闅v每一層級(jí)的文件夾,若仍存在文件夾,則繼續(xù)
    發(fā)表于 02-16 21:36

    一種面向標(biāo)識(shí)公共遞歸解析節(jié)點(diǎn)的數(shù)據(jù)安全加固策略

    摘要 :為解決工業(yè)互聯(lián)網(wǎng)標(biāo)識(shí)解析體系公共遞歸解析節(jié)點(diǎn)信息透明、缺乏隱私數(shù)據(jù)保護(hù)和身份權(quán)限管理等問題,提出了一種面向標(biāo)識(shí)公共遞歸解析節(jié)點(diǎn)的數(shù)據(jù)安全加固策略。通過設(shè)計(jì)加密機(jī)制及細(xì)粒度權(quán)限查驗(yàn)機(jī)制,實(shí)現(xiàn)了標(biāo)識(shí)解析二級(jí)節(jié)點(diǎn)的編碼注冊(cè)和解析服務(wù)的安全加固,提高了標(biāo)識(shí)解析數(shù)據(jù)共享的安
    的頭像 發(fā)表于 12-26 11:27 ?613次閱讀
    一種面向標(biāo)識(shí)公共<b class='flag-5'>遞歸</b>解析節(jié)點(diǎn)的數(shù)據(jù)安全加固策略

    感應(yīng)加熱技術(shù)有沒有缺點(diǎn)?所有的工件都可以用電磁感應(yīng)加熱設(shè)備嗎?

    感應(yīng)加熱技術(shù)有沒有缺點(diǎn)?所有的工件都可以用電磁感應(yīng)加熱設(shè)備嗎
    的頭像 發(fā)表于 12-19 14:17 ?799次閱讀

    Zookeeper所有節(jié)點(diǎn)都可以處理請(qǐng)求

    ,使得開發(fā)者可以基于此構(gòu)建可靠的分布式應(yīng)用程序。Zookeeper 節(jié)點(diǎn)間通過通信協(xié)議協(xié)作工作,在節(jié)點(diǎn)之間分配工作使得請(qǐng)求可以所有節(jié)點(diǎn)處理。 Zookeeper 提供了一個(gè)結(jié)構(gòu)化的命名空間來管理數(shù)據(jù),這個(gè)命名空間被組織成一個(gè)類
    的頭像 發(fā)表于 12-04 10:42 ?492次閱讀

    python數(shù)字排列組合需要縮進(jìn)嗎

    在Python中,數(shù)字排列組合的實(shí)現(xiàn)通常需要使用循環(huán)和遞歸來生成所有可能的組合。對(duì)于代碼塊中的循環(huán)和遞歸部分,縮進(jìn)是必需的,它用于標(biāo)識(shí)這些語句屬于循環(huán)或
    的頭像 發(fā)表于 11-29 16:40 ?356次閱讀

    為什么任何信號(hào)都可以分為共模和差模的疊加呢?

    為什么任何信號(hào)都可以分為共模和差模的疊加呢? 任何信號(hào)都可以分為共模和差模的疊加是因?yàn)樾盘?hào)的傳輸和處理中存在一定的干擾和噪聲。 共模信號(hào)是指同時(shí)作用于信號(hào)的兩個(gè)正負(fù)極性導(dǎo)線或端口的信號(hào),其大小和方向
    的頭像 發(fā)表于 11-20 16:28 ?744次閱讀