斐波那契數列,遞迴與迴圈

2021-10-04 19:34:57 字數 1370 閱讀 6623

斐波那契數列(fibonacci sequence),又稱**分割數列、兔子數列,是數學家列昂納多·斐波那契於2023年提出的數列。

斐波那契數列為1、1、2、3、5、8、13、21、34……此數列從第3項開始,每一項都等於前兩項之和,遞推公式為f(n)=f(n-1)+f(n-2),n≥3,f(1)=1,f(2)=1。(老規矩,繼續抄搜狗百科的一段介紹)

斐波那契數列通項的數學公式如下

但是在程式設計程式中實現斐波那契數列通項的計算,只需要根據其規律,就很簡單的實現了。最被人輕易的想到的實現方法一般有兩種,迴圈和遞迴實現,迴圈實現如下

int fibo(const int n)

return k3;

}

說一下,這裡定義三個變數,第一項第二項,還有通過規律求和所得的第三項,判斷語句判斷需要求的項若是第一二項,直接返回值為1,若為大於第二項之後的項,則通過k1,k2,k3,三個標記來求得。k1,k2分別標記第一二項,然後第三項通過一二項求得,然後標記往後走,第三項別為第二項,第二項變為第一項,然後迴圈加一。就實現了通過迴圈求斐波那契數列項。

遞迴要比迴圈還要簡單**如下

int fibo(const int n)

直接若第一項或者第二項就返回1,之後項就通過求前兩項之和,**十分簡單,但是有弊端,像漢諾塔一樣,使用遞迴的方法,但是斐波那契數列並不適合用遞迴來實現,若是我們需要求的項是很大的項,例如這裡測試的是第四十項,通過迴圈的話,結果是一瞬間得出的,而使用遞迴的話,需要等待大概七秒鐘左右的時間,這只是第四十項,在效率方面就已經這麼明顯的體現出來,再大的項,使用遞迴,可能直接奔潰。這裡附上兩張圖來說明一下。

這裡以n為五為例,普通變數是儲存在棧中的,若是函式不結束,就不會被釋放,然而棧幀儲存並不大,所以,n為5,進入到遞迴函式中,執行至else後語句,他會再次呼叫n=4,此時函式繼續執行至else後的語句再呼叫n=3,並且之前的n=5和n=4的記憶體並不釋放,一直呼叫至n=2與n=1(寫到這裡才注意到出棧圖是有一點問題的,n=2的地方應該是執行完畢的,並非執行至else暫停),然後函式得到結果,返回給n=3,n=4,n=5,逐級返回,每有乙個函式執行完畢,該函式的記憶體才會釋放,所以遞迴函式再執行時,若是需要遞迴的次數太過多,會一直占用著棧幀無法釋放,若需要的記憶體大過棧幀的大小,程式就會奔潰掉,所以這也是該程式使用遞迴實現不適合的原因。

相比較之下,迴圈就不同了,迴圈僅僅需要建立k1,k2,k3,三個標記變數,就可以實現,所以占用記憶體並不大,執行相對也會快很多。

迴圈斐波那契數列 斐波那契數列應用

什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...

遞迴與斐波那契數列

迭代實現 def fab n a1 1 a2 1 a3 1if n 1 print 輸入有誤 return 1 while n 2 0 a3 a1 a2 a1 a2 a2 a3 a 1return a3 result fab 20 if result 1 print 總共有 d對小兔子誕生 resu...

斐波那契數列(遞迴與迴圈的區別)

遞迴 include long long f unsigned int n return n 2?t n f n 1 f n 2 void main 迴圈 include long long f unsigned int n if n 2 return t n long long s1 0 long...