題目:
方法一:遞迴實現
//時間複雜度o(n^2)
//空間複雜度o(n)
缺點:①只是使用於n比較小的時候,否則效率低,因為會做很多次重複操作
②而且該例遞迴屬於多分支遞迴,容易造成棧溢位
方法二:非遞迴實現(迭代)
//時間複雜度o(n)
//空間複雜度o(1)
long
long
fib(size_t n)
return n3;
}
方法三:尾遞迴實現
//時間複雜度o(n)
優點:①計算結果參與到下一次的計算,從而減少很多重複計算量
②原本樸素的遞迴產生的棧的層次像二叉樹一樣,以指數級增長,但是現在棧的層次卻像是陣列,變成線性增長了,簡單來說,原本棧是先擴充套件開,然後邊收攏邊計算結果,現在卻變成在呼叫自身的同時通過引數來計算。
尾遞迴可以轉換成迭代演算法
總結:
尾遞迴的本質是:將單次計算的結果快取起來,傳遞給下次呼叫,相當於自動累積
方法四:矩陣乘法實現 (最優解)
#include
//base 底數 ,exp 指數
intqpow
(int base,
int exp)
base=base*base;
exp>>=1;
//右移一位
}return ret;
}int
main()
注:此方法借鑑與 谷歌面試題精選
#include
#include
using namespace std;
//定義2×2矩陣;
struct matrix2by2
//資料成員
long m00;
long m01;
long m10;
long m11;};
//定義2×2矩陣的乘法運算
matrix2by2 matrixmultiply
(const matrix2by2& matrix1,
const matrix2by2& matrix2)
//定義2×2矩陣的冪運算
matrix2by2 matrixpower
(unsigned
int n)
else
if(n %2==
0)else
if(n %2==
1)return matrix;
}//計算fibnacci的第n項
long
fibonacci
(unsigned
int n)
intmain()
結語:努力的人生是完美的,因為不曾後悔過!!!
斐波那契數列求解的優化
題目 給定整數n,返回斐波那契數列的第n項。解法一 暴力遞迴,時間複雜度為o 2 n int fun int n else if n 1 n 2 return fun n 1 fun n 2 解法二 儲存前面求出的值,時間複雜度為o n int fun int n else if n 1 n 2 e...
斐波那契數列求解
斐波那契數列是一種常見的數列,其滿足下面兩個條件 f0 f1 1 fn fn 1 fn 2 斐波那契數列求解def fib1 n if n 2 return 1 return fib1 n 1 fib1 n 2 不適用遞迴 python def fib2 n f1 f2 1 for i in ran...
Matlab求解斐波那契數列
下面是乙個matlab的指令碼函式,用於求解菲波那切數列,而且可以判斷輸入是否符合實際情況 function fibona n 斐波那契數列,前兩項之和等於第三項 f n f n 1 f n 2 第一項和第二項分別都是1 f 1 1,f 2 1 程式主題 if n 3 disp n warning ...