斐波那契數列(高效遞迴版)

2021-10-02 15:04:59 字數 782 閱讀 3394

斐波那契數列:1,1,2,3,5,8,13,21,34,55 …

定義: f(1) = 1, f(2) = 1, f(n) = f(n-1) + f(n-2) (n >= 3)

初學的做法通常如下:

int

fab(

int n)

但這樣做很大的缺陷是在遞迴呼叫時會有大量的記憶體占用,在參加競賽時會因超時而報錯。

因為當遞迴計算f(i)時會有大量重複計算:

從圖中可以看到 fab(n-2) 和 fab(n-3) 都重複計算了,這還只是個小例子,當 n 很大時,計算量就很驚人了。

這裡有一種降低空間複雜度的方法:建立乙個記錄陣列,當f(i)計算完成後儲存到記錄陣列中,這樣當有重複計算時,我們可以直接到記錄陣列中讀取。現在原先的**只需要些小改動:

#define max 1000000

int record[max]

;int

fab(

long n)

return record[n];}

}

初始化全域性陣列record時,未指定時預設為0;所以當record[i] == 0時,我們將計算出的f[i]寫入,當record[i] != 0 時,說明record[i]已經寫入,只需從record[i]中讀取f[i]。 這樣每個f[i]只需計算一次,節省了重複計算的時間量和空間量。

遞迴與斐波那契數列

迭代實現 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...

遞迴演算法斐波那契數列

有一對兔子,從出生後第3個月起,每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子。假如兔子都不死,求第n個月兔子對數 關於斐波那契數列的兔子繁殖問題其實如下 實際月份 123 4567 8幼仔對數 101 1235 8成兔對數 011 2358 13總體對數 112 35813 21幼仔對...

遞迴實現斐波那契數列

斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n package com.algorithm.tiger.recursion 遞迴和非遞迴方法實現斐波那契數列 斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n descripti...