3 回答

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
這取決于使用的語(yǔ)言。你寫了'語(yǔ)言不可知',所以我舉一些例子。
在Java,C和Python中,與迭代(通常)相比,遞歸相當(dāng)昂貴,因?yàn)樗枰峙湫碌亩褩?。在某些C編譯器中,可以使用編譯器標(biāo)志來(lái)消除此開銷,這會(huì)將某些類型的遞歸(實(shí)際上是某些類型的尾調(diào)用)轉(zhuǎn)換為跳轉(zhuǎn)而不是函數(shù)調(diào)用。
在函數(shù)式編程語(yǔ)言實(shí)現(xiàn)中,有時(shí),迭代可能非常昂貴,并且遞歸可能非常便宜。在許多情況下,遞歸轉(zhuǎn)換為簡(jiǎn)單的跳轉(zhuǎn),但是更改循環(huán)變量(這是可變的)有時(shí)需要一些相對(duì)繁重的操作,尤其是在支持多個(gè)執(zhí)行線程的實(shí)現(xiàn)上。由于mutator和垃圾收集器之間的交互,如果兩者可能同時(shí)運(yùn)行,在某些環(huán)境中突變是昂貴的。
我知道在一些Scheme實(shí)現(xiàn)中,遞歸通常比循環(huán)更快。
簡(jiǎn)而言之,答案取決于代碼和實(shí)現(xiàn)。使用您喜歡的任何風(fēng)格。如果您使用的是函數(shù)式語(yǔ)言,則遞歸可能會(huì)更快。如果您使用命令式語(yǔ)言,迭代可能會(huì)更快。在某些環(huán)境中,這兩種方法都會(huì)導(dǎo)致生成相同的程序集(將其放入管道并對(duì)其進(jìn)行抽吸)。
附錄:在某些環(huán)境中,最好的選擇既不是遞歸也不是迭代,而是高階函數(shù)。這些包括“map”,“filter”和“reduce”(也稱為“fold”)。這些不僅是首選樣式,不僅通常更清晰,而且在某些環(huán)境中,這些函數(shù)是第一個(gè)(或唯一)從自動(dòng)并行化中獲得提升的功能 - 因此它們可以比迭代或遞歸快得多。Data Parallel Haskell就是這種環(huán)境的一個(gè)例子。
列表推導(dǎo)是另一種選擇,但這些通常只是迭代,遞歸或更高階函數(shù)的語(yǔ)法糖。

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
如果替代方法是顯式管理堆棧,遞歸可能會(huì)更快,就像您提到的排序或二叉樹算法一樣。
我有一個(gè)案例,用Java重寫遞歸算法使它變慢。
因此,正確的方法是首先以最自然的方式編寫它,只有在分析顯示它是關(guān)鍵的時(shí)候進(jìn)行優(yōu)化,然后測(cè)量所謂的改進(jìn)。
- 3 回答
- 0 關(guān)注
- 1989 瀏覽
添加回答
舉報(bào)