2012-10-17 522 views
-1

可能重複:
Recursion and Iteration遞歸與非遞歸

是什麼遞歸和非遞歸函數之間的區別?斐波納契準確。

我正在尋找與時間和記憶有關的答案。

+3

遞歸函數調用遞歸函數。 – raina77ow

+0

@ raina77ow,好的,但這是因爲遞歸函數直接或間接地調用自己。 – TheBlastOne

+2

你在問什麼是遞歸和迭代之間的區別......它已經在SO上回答了很多次,http://stackoverflow.com/questions/72209/recursion-or-iteration和http://stackoverflow.com/問題/ 2576993 /遞歸和迭代和http://stackoverflow.com/questions/2185532/why-should-recursion-be-preferred-over-iteration – Arham

回答

0

遞歸函數是以編程語言實現的過程或子例程,其實現引用自身。

非遞歸函數是一種編程語言實現的程序或子程序,其實施不引用自身

下面是遞歸和非遞歸斐波那契數列的鏈接: - Recursive and Non Recursive Fibonacci Series

+0

好吧,現在告訴我:這些 - 函數a(x ){return x? b(x-1):0; }函數b(x){return x? a(x-1):0; ''遞歸? – raina77ow

+0

我不同意。我可以開發一個用給定的編程語言編寫的函數,它調用用不同的編程語言編寫的函數,並且這兩個實現都引用「其他」函數。結果:遞歸引用,在每個函數的實現中不可見。這是一個間接遞歸。 – TheBlastOne

+0

@ raina77ow,沒錯,你甚至不需要使用不同的語言。遞歸。間接的影響。 – TheBlastOne

1

「遞歸」只是手段一個函數自己調用。這可能是也可能不是有意的(無意的遞歸是造成大量崩潰的原因)。

故意遞歸(其中一個函數執行操作的一部分,然後調用自己執行其餘部分)通常是一種有用的編程範例,但需要某種程度的理解/經驗/技巧才能「 。

基本上,遞歸可以用來代替「迭代」(循環)並替換伴隨的數組分配(使用函數體的局部變量)。但並不是每個迭代或使用數組的函數都可以有效地轉換爲遞歸等價的。

如果該問題適用於遞歸,可以經常編寫一個遞歸版本,該版本與非遞歸版本的執行效率相當......可能稍微更好或更差,具體取決於調用機制的效率如何與語言/編譯器中的循環和數組索引相比。在存儲方面,遞歸很少有效,但是它不需要爲特定的問題預先分配(並且預先知道分配的大小)。

大多數情況下,遞歸更好(實際上是),因爲它使得實現更簡單,更容易出錯,並且錯誤是計算中最大的成本。 (但是,當然,做得不當也可能花費你很大的時間。)

當遞歸很好時,它非常好。當遞歸不好時,它非常糟糕。

+0

那麼時間不受影響?記憶如何? – dalawh

+0

兩者都受到影響,只是效果不可預測。在簡單情況下,遞歸的內存要高得多,因爲每次調用都會有一個堆棧幀開銷。但是對於複雜的情況,爲了「萬一」分配大型陣列的需求被消除了。 –