1. 程式人生 > >統計每個月兔子的總數【斐波那契】

統計每個月兔子的總數【斐波那契】

題目

描述

有一對兔子,從出生後第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的遞推變換矩陣:

[f(n+2)f(n+1)]=[1110][f(n+1)f(n)]
並進一步得到:
[f(n+1)f(n)]=[1110]n[f(1)f(0)]

這樣就把線性遞推問題轉化為了矩陣的n次冪經典問題,在O(log n)時間複雜度內解決。除了線性遞推數列,初等數學中著名的n元一次方程組問題也可以轉化為矩陣和向量乘法形式更容易地解決。這個例子是想說明,凡是滿足線性關係的系統都是向量模型的用武之地,我們往往可以把它轉化為線性代數得到簡潔高效的解決方案。


詳情可以參考: