3 回答

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

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