菲波那切數列 遞迴非遞迴

2021-09-29 06:31:15 字數 1450 閱讀 6278

面試經常遇到有人問菲波那切數列,並且問題也越來越刁鑽,遞迴,非遞迴,尾遞迴等各種實現方式不一而足,已經不是最開始那個正經的斐波那契了。弄來弄去,還是要理解他的實現原理,以不變應萬變。

數列形式:1,1,2,3,5,8,13·······求第n個數(n>=3)

這個數列的第n個數,等於前兩個數的和,數列的前兩個數為固定值,從第三個開始形成規律。現在說一下我對n的理解,很多網上的數列都是從0開始的,0,1,1,2,3······(n>=3),我覺著這個n的含義是第幾個數,第0個數總感覺怪怪的,如果只是純數學不管n的含義,那倒是隨便。

正常遞迴:

public function test($n)
尾遞迴:

function lasttest($n,$res1,$res2)

//呼叫

echo lasttest($n,1,1)

先解釋一下這倆個遞迴和結果為什麼差距這麼大:

第一:正常遞迴那個一次遞迴呼叫兩次本身,類似於二叉樹往下**,1生2,2生4,對於記憶體的消耗是指數級增長。而尾遞迴每次只是呼叫一次本身,記憶體消耗是線性增長。

第二:隨便舉個例子,求第6個數,正常遞迴:test(5)+test(4) 繼續** test(4)+test(3)+test(3)+test(2) 繼續**:test(3)+test(2)+test(2)+test(2)+test(2) 繼續** test(2)+test(2)+test(2)+test(2)+test(2)+test(2),可以看到,相同的值他要進行多次重複運算。尾遞迴:每次算完的res1+res2的值都會賦給下一次迴圈的的res2,然後將res2賦給res1,不會進行重複運算。

假如計算第6個數,res1每次計算等於上次的res2,res2每次計算等於上次的res1+res2:

尾遞迴執行演示 n

res1

res261

1512

4233

3525

81813

我只計算到第35個數,是因為數再大正常遞迴已經超過php指令碼預設執行時間30秒,再大很快記憶體就超了。這個演算法要是執行在程式中簡直就是毒瘤······

下邊是非遞迴for迴圈(這兩個for迴圈其實一樣的就是乙個遞增乙個遞減):

正常迴圈:

function test($n)

return $res;

}

也是正常迴圈(**就改了一點點):

function test($n)

return $res;

}

這倆個for迴圈的時間剛好一樣,多點幾次相差不大,我就用這兩個時間了。尾遞迴那個很厲害了,竟然跟for迴圈乙個量級,不過還是慢了4倍左右,多刷幾次都是4倍左右,第乙個就不說了。

所以這裡邊就牽扯到乙個程式優化問題,面試的時候如果問你程式如何優化,我覺得盡量不用遞迴也算是很重要的乙個優化手段。

菲波那切數列

防止明天沒有時間或者忘了寫,今天先寫下吧。如果一對兔子每月生一對兔子 一對新生兔,從第二個月起就開始生兔子 假定每對兔子都是一雌一雄,試問一對兔子,一年能繁殖成多少對兔子?首先這個題目的設定是原來的一對兔子在一開始是新生的兔子,這樣這對兔子在第二個月才能生下一對新的兔子 也就是第三個月開始,第二個月...

菲波那切數列

現在已知fibonacci 菲波那切 數列的前幾項0 1 1 2 3 5 8 程式設計求出第 n 項。輸入一行,包含乙個正整數n 1 n 50輸出乙個整數。有兩種實現方式 1.遞迴實現 include include using namespace std long long f int n int...

菲波那切數列

題目描述 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 時間限制 c c 1秒,其他語言2秒 空間限制 c c 32m,其他語言64m 熱度指數 808696 class solution def fibonacci self,n wr...