一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

    文章

    4379

    瀏覽量

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

    關(guān)注

    30

    文章

    4899

    瀏覽量

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

    關(guān)注

    0

    文章

    29

    瀏覽量

    9184

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

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

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    怎么把UI設(shè)計(jì)稿轉(zhuǎn)為代碼?在線UI設(shè)計(jì)工具一鍵生成!

    近日,華為開發(fā)者大會(huì)2025(HDC)在東莞松山湖正式拉開帷幕,這場(chǎng)備受矚目的盛會(huì)為全球科技行業(yè)帶來了諸多驚喜。其中,Pixso團(tuán)隊(duì)發(fā)布的全新設(shè)計(jì)稿一鍵轉(zhuǎn)代碼功能,成為了本次大會(huì)的一大亮點(diǎn)。這項(xiàng)創(chuàng)新
    的頭像 發(fā)表于 06-25 12:04 ?196次閱讀
    怎么把UI設(shè)計(jì)稿<b class='flag-5'>轉(zhuǎn)為</b><b class='flag-5'>代碼</b>?在線UI設(shè)計(jì)工具一鍵生成!

    OLED代碼分享

    OLED代碼
    發(fā)表于 04-29 17:04 ?1次下載

    ads1256能夠?qū)拇嫫髦挡僮?,讀寫都可以,就是讀出的AD值不正確,為什么?

    ads1256能夠?qū)拇嫫髦挡僮?,讀寫都可以,就是讀出的AD值不正確,電路直接照手冊(cè)參考電路接的,參考電壓直接拉到5V用面包板搭的電路。
    發(fā)表于 02-12 07:38

    代碼與傳統(tǒng)開發(fā)的區(qū)別 低代碼與無代碼開發(fā)的區(qū)別

    的工具和圖形界面來縮短開發(fā)時(shí)間和降低技術(shù)門檻。以下是對(duì)低代碼開發(fā)與傳統(tǒng)開發(fā)的詳細(xì)對(duì)比: 適用人群 傳統(tǒng)開發(fā) :主要適用于有經(jīng)驗(yàn)、有基礎(chǔ)的程序員,他們可以利用各種編碼語(yǔ)言進(jìn)行應(yīng)用程序的創(chuàng)建。傳統(tǒng)開發(fā)需要深厚的編程功底
    的頭像 發(fā)表于 01-31 10:48 ?607次閱讀

    代碼在敏捷開發(fā)中的應(yīng)用

    代碼平臺(tái)的定義 低代碼平臺(tái)提供了一個(gè)可視化的、拖放式的用戶界面,允許開發(fā)者通過圖形化的方式快速構(gòu)建應(yīng)用程序,而無需編寫大量的代碼。這些平臺(tái)通常包括預(yù)構(gòu)建的模板、組件和邏輯模塊,使得開發(fā)人員
    的頭像 發(fā)表于 01-07 09:58 ?442次閱讀

    AFE0064的輸入應(yīng)該是電荷信號(hào)還是電流信號(hào)呢?還是都可以?

    想問一下,AFE0064的輸入應(yīng)該是電荷信號(hào)還是電流信號(hào)呢?還是都可以
    發(fā)表于 12-04 06:07

    如何安全有效的刪代碼?

    和建議,幫助你更安全有效地刪除代碼: 確定范圍 優(yōu)化總是被鼓勵(lì)的,但方式和時(shí)間是同時(shí)需要被考慮進(jìn)去的因素 方式:這個(gè)方案是否好,有無漏洞?投入產(chǎn)出效益比如何? 時(shí)間:是否要在這個(gè)版本,哪個(gè)版本能使所有開發(fā)投入時(shí)間最少
    的頭像 發(fā)表于 11-20 10:39 ?600次閱讀

    Gmapping源代碼

    Gmapping源代碼.docx
    發(fā)表于 11-16 13:42 ?0次下載

    代碼整潔之道-大師眼中的整潔代碼是什么樣

    幾個(gè)月前寫了一篇文章“如何寫出難以維護(hù)的代碼”,從中能大概了解到不好維護(hù)的代碼是什么樣,有哪些壞味道,那肯定有人會(huì)反問,難以維護(hù)的代碼見的太多了,也知道長(zhǎng)什么樣,但是對(duì)于好維護(hù)的代碼
    的頭像 發(fā)表于 09-09 16:30 ?645次閱讀
    <b class='flag-5'>代碼</b>整潔之道-大師眼中的整潔<b class='flag-5'>代碼</b>是什么樣

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

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

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

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

    ADS7823的參考電壓和iic通訊端口是否都可以連接5V電壓?

    根據(jù)ADS7823的規(guī)格書vdd最大輸入電壓為5V,想請(qǐng)教一下再VDD輸入5V電源,芯片的參考電壓和iic通訊端口是否都可以連接5V電壓?
    發(fā)表于 08-13 07:28

    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 ?710次閱讀

    國(guó)內(nèi)低代碼平臺(tái)推薦--萬界星空科技低代碼平臺(tái)

    代碼平臺(tái)是一種應(yīng)用程序,它為編程提供圖形用戶界面,從而以極快的速度開發(fā)代碼,減少傳統(tǒng)編程工作。 這些工具有助于快速開發(fā)代碼,最大限度地減少手工編碼的工作量。這些平臺(tái)不僅有助于編碼,還有助于快速設(shè)置和部署。
    的頭像 發(fā)表于 07-18 15:39 ?565次閱讀
    國(guó)內(nèi)低<b class='flag-5'>代碼</b>平臺(tái)推薦--萬界星空科技低<b class='flag-5'>代碼</b>平臺(tái)

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

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