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

完善資料讓更多小伙伴認(rèn)識你,還能領(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)為迭代算法是因為遞歸借助函數(shù)調(diào)用,函數(shù)調(diào)用本身就是基于調(diào)用棧這種結(jié)構(gòu)實現(xiàn)的,只不過這一切都是自動完成的,我們當(dāng)然也可以用代碼手動模擬出來。

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

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

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

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

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

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

審核編輯 :李倩

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

    關(guān)注

    3

    文章

    4332

    瀏覽量

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

    關(guān)注

    30

    文章

    4790

    瀏覽量

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

    關(guān)注

    0

    文章

    28

    瀏覽量

    9029

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

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

收藏 人收藏

    評論

    相關(guān)推薦

    java反編譯的代碼可以修改么

    Java反編譯是一種將編譯后的Java字節(jié)碼(.class文件)轉(zhuǎn)換回源代碼的過程。反編譯后的代碼可以進(jìn)行修改,但是需要注意,反編譯代碼的質(zhì)量和可讀性可能會受到原始編譯
    的頭像 發(fā)表于 09-02 11:00 ?702次閱讀

    hex可以轉(zhuǎn)成源代碼

    Hex文件可以轉(zhuǎn)換成源代碼的近似形式,但無法直接還原為原始的、完全相同的源代碼 。這是因為Hex文件是二進(jìn)制文件,包含了程序編譯后的機(jī)器碼,這些機(jī)器碼與原始的源代碼在結(jié)構(gòu)和表達(dá)上存在顯
    的頭像 發(fā)表于 09-02 10:41 ?1042次閱讀

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

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

    人員定位系統(tǒng)都可以用于哪些行業(yè)?

    。 一、人員定位系統(tǒng)都可以用于哪些行業(yè)? 這套系統(tǒng)可以服務(wù)的行業(yè)非常多,尤其是崗位具有一定危險性的,那么定位系統(tǒng)可以說發(fā)揮的作用十分明顯,比如化工廠、消防員、礦井、戶外勘探等,而為了便于人員管理的場景也
    的頭像 發(fā)表于 07-15 11:32 ?366次閱讀
    人員定位系統(tǒng)<b class='flag-5'>都可以</b>用于哪些行業(yè)?

    遞歸神經(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 ?673次閱讀
    <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ò)的實現(xiàn)方法

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

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

    RNN(Recurrent Neural Network)是循環(huán)神經(jīng)網(wǎng)絡(luò),而非遞歸神經(jīng)網(wǎng)絡(luò)。循環(huán)神經(jīng)網(wǎng)絡(luò)是一種具有時間序列特性的神經(jīng)網(wǎng)絡(luò),能夠處理序列數(shù)據(jù),具有記憶功能。以下是關(guān)于循環(huán)神經(jīng)網(wǎng)絡(luò)的介紹
    的頭像 發(fā)表于 07-05 09:52 ?585次閱讀

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

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

    遞歸神經(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),它們在處理序列數(shù)據(jù)
    的頭像 發(fā)表于 07-05 09:28 ?890次閱讀

    遞歸神經(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ù)測給定詞序列中下一個詞的概率分布。
    的頭像 發(fā)表于 07-04 14:58 ?714次閱讀

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

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

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

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

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

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

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

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

    電感量一樣都可以代換嗎

    電感作為電路中的重要電子元器件,它在電路中的作用主要是儲存能量和濾波。在電感使用中,我們經(jīng)常會遇到有客戶咨詢關(guān)于電感替換的問題。有人問是不是電感量一樣都可以替換?本篇我們就來簡單探討以下這個問題吧
    的頭像 發(fā)表于 01-17 09:49 ?520次閱讀