斐波拉契數列的遞迴 非遞迴 公式法多種方法實現

2021-07-12 04:21:17 字數 1257 閱讀 1581

實現斐波拉契數列: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項 時間...