斐波那契數列: f(n)=f(n-1)+f(n-2); n>=2
f(0)=0; f(1)=1;
即有名的兔子繁衍問題。
斐波那契數列共有三種解法,因而寫這篇文章總結一下。
1. 遞迴求解
遞迴求解比較簡單,是大家常見的一種解法。
int fibonacci(int n)
if (n==1)
return fb(n-1)+fb(n-2);
}
關於這種解法,不再贅述,下面主要說下時間複雜度分析。
設f(n)為引數為n時的時間複雜度,很明顯:f(n)=f(n-1)+f(n-2)
這就轉化為了數學上的二階常係數差分方程,並且為其次方程。
即轉化為了求f(n)的值,f(n)=f(n-1)+f(n-2)且f(0)=0; f(1)=1;
特徵方程為:x^2-x-1=0
得 x=(1±√5)/2
因而f(n)的通解為:
由f(0)=0; f(1)=1可解得c_1,c_2
最終可得,時間複雜度為:
第一種解法比較簡單,但是多個元素重複計算,因而時間複雜度較高,為了避免重複計算,可進行迴圈計算減少時間複雜度
int fibonacci(int n)
if (n==1)
intmin=0;
intmax=1;
int i=2;
int result=0;
while (i<=n)
return result;
}
第二種演算法時間複雜度為o(n)
3. 還有一種時間複雜度更低的演算法。
根據上面的遞迴公式,我們可以得到
因而計算f(n)就簡化為了計算矩陣的(n-2)次方,而計算矩陣的(n-2)次方,我們又可以進行分解,即計算矩陣(n-2)/2次方的平方,逐步分解下去,由於折半計算矩陣次方,因而時間複雜度為o(log n)
具體**實現如下:
//
// main.cpp
// fibonaccimatrix
//// created by shunagao on 15/8/31.
//#include
using
namespace
std;
class matrix
n=num;
clear();
}void clear()}}
void unit()
}matrix operator=(const matrix mtx)
matrix operator*(const matrix &mtx)
};int main(int argc, const
char * argv)
first=first*first;
n=n/2;
}cout
<
0;}
斐波那契數列的三種解法
寫乙個函式,輸入n,求斐波那契數列的第n項。斐波那契數列的定義如下 課本的上為了講解遞迴演算法,經常用這個例子。讓我們看一下它的實現 package algorithm public class fibonacci recursion public static void main string a...
斐波那契數列解法
方法一 常規解法 def demo month 定義變數 a,b分別表示一月和二月的數目 a 0 a為第乙個數值 b 1 b為第二個數值 定義乙個計數器 i 0 while i month 列印每次的數值 print a a,b b,a b i 1 nume demo 3 方法二 函式的遞迴 def...
斐波那契數列解法
1 概念 在數學上,費波那契數列是以遞迴的方法來定義 f0 0 f1 1 fn fn 1 fn 2 n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis...