統計每個月兔子的總數【斐波那契】
阿新 • • 發佈:2019-01-28
題目
描述
有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
輸入
輸入int型表示month
輸出
輸出兔子總數int型
樣例輸入
9
樣例輸出
34
思路
斐波那契數列。。。
第一個月 1對兔子
第二個月 1對兔子
第三個月 2對兔子
第四個月 3對兔子
。。。。
程式碼
#include <iostream>
using namespace std;
int Facbonali(int num)
{
if (num==0)
{
return 0;
}
else if(num==1)
{
return 1;
}
else
{
return Facbonali(num-1)+Facbonali(num-2);
}
}
int main()
{
int N;
cin>>N;
cout<<Facbonali(N)<<endl;
}
說到斐波那契數列
Fibonacci數列定義為:f(n) = f(n-1) + f(n-2), f(0) = 0, f(1) = 1;問題:輸入n,請給出求f(n)的時間複雜度不超過O(logn)的演算法。
首先,我們構造兩個向量v1=(f(n+1), f(n))和v2=(f(n+2), f(n+1)),根據Fibonacci
數列性質,我們可以得到從v1到v2的遞推變換矩陣:
並進一步得到:
這樣就把線性遞推問題轉化為了矩陣的n次冪經典問題,在O(log n)時間複雜度內解決。除了線性遞推數列,初等數學中著名的n元一次方程組問題也可以轉化為矩陣和向量乘法形式更容易地解決。這個例子是想說明,凡是滿足線性關係的系統都是向量模型的用武之地,我們往往可以把它轉化為線性代數得到簡潔高效的解決方案。
詳情可以參考: