實現斐波拉契數列:1,1,2,3,5,8...,當n>=3時,f(n)=f(n-1)+f(n-2)。
解:求解斐波拉契數列方法很多,這裡提供了4
種實現方法和**,由於第
5種數學公式方法**太過繁瑣,只做簡單介紹
方法一:
遞迴呼叫,
每次遞迴的時候
有大量重複計算,效率低
,可將其呼叫的過程轉化成一顆二叉樹進行分析,二叉樹的總結點個數不超過(2^n-1)個,由於其是不完全二叉樹,那麼函式計算的次數必小於(2^n-1),時間複雜度為o(2^n);遞迴呼叫的深度為n,空間複雜度為o(n)
方法二:
非遞迴陣列方式,迴圈中仍然有重複計算
,時間複雜度為o(n),空間複雜度為o(1)
方法三:
非遞迴迴圈方式,
將前兩項的計算結果儲存起來,
無重複計算
,時間複雜度為o(n),空間複雜度為o(1)
方法四:
直接利用數學公式法
:f(n)=/(5^0.5)
,時間複雜度為o(1),空間複雜度為o(1)
實現**如下:
#include
#include
using namespace std;
//方法一:遞迴呼叫,有大量重複計算,效率低
long long fibonacci1(int n)
//方法二:非遞迴陣列方式,迴圈中仍然有重複計算
long long fibonacci2(int n)
//方法三:非遞迴迴圈方式,將前兩項的計算結果儲存起來,無重複計算
long long fibonacci3(int n)
//方法四:直接利用數學公式法:f(n)=/(5^0.5)
long long fibonacci4(int n)
//測試**
int main()
方法5:生僻的數學公式法
f(n) f(n-1) 1 1
[ ] = [ ]^(n-1)
f(n-1) f(n-2) 1 0
該公式可用數學歸納法進行證明,在矩陣乘法的變換證明過程中,要注意運用斐波拉契數列的性質:後一項為前面兩項之和;該數學公式,應用矩陣的乘法,時間複雜度僅為o(log n),
時間效率雖然低,但不夠實用,原始碼太過繁瑣,參考劍指
0ffer面試題9
的原始碼本文出自 「巖梟」 部落格,請務必保留此出處
斐波拉契數列,遞迴實現
1,1,2,3,5,8 規律是當前數為前兩個數的和。比如生兔子問題就是這樣 第一天只有乙個小兔子 1 第二天小兔子長成大兔子並且懷孕 1 第三天大兔子生下乙個小兔子 2 第四天小兔子長大前乙個大兔子又生下乙個小兔子 3 第五天兩個成年兔子分別生下了乙個兔子,前一天生下的兔子又上大 5 叫求第100天...
斐波那契數列 遞迴與非遞迴
首先來說下遞迴,遞迴的思想是大事化小。斐波那契數列 1,1,2,3,5,8,13,21.設f n 是第n個斐波那契數,當n 2,斐波那契數都為1 當n 2,那麼第f n 個斐波那契數就等於前兩個斐波那契數之和。遞迴的 實現 includeint fbnq int n int main 輸入10,得到...
數學 斐波那契數列 遞迴 非遞迴
include pch.h include using std cout using std cin typedef long long ll int fib int n ll fib notrec int n int main return 0 題目給的f 0 1,就這麼寫了 斐波那契第n項 時間...