首先百度之後知道,fibonacci數列其實在科學中有著廣泛的應用,下面一句話引子百度百科:在現代物理、準晶體結構、化學等領域,斐波納契數列都有直接的應用。
了解fibonacci數列的人都知道它的推到公式:
0 n=0
f(n)=1 n=1
f(n-1)+f(n-2) n>=2
有時候遇到的問題是如何求解fibonacci數列的各項的值,我記得有兩種方法,就是遞迴方法和應用迴圈的方法。下面給出兩種程式的**:
[cpp]
#include
int fibonacci_recursion(int n)
; if(n<2)
return result[n];
else
return fibonacci_recursion(n-1)+fibonacci_recursion(n-2);
} int fibonacci_non_recursion(int n)
; if(n<2)
return result[n];
int i;
int fa=0,fb=1,fc;
for(i=1;i
return fc;
} void main()
上面的兩個方法都是在o(n)的時間內得到解,但是在csdn的論壇上看到有人說,可以再o(logn)時間內求得fibonacci數列的第n項值,於是google了一下,找到了一篇博文,的確可以在o(logn)內求解。
有乙個數學公式: =n-1。
(注:表示乙個矩陣。在矩陣中第一行第一列是f(n+1),第一行第二列是f(n),第二行第一列是f(n),第二行第二列是f(n-1)。)
下面就來證明一下這個公式的正確性:fibonacci的第0項為0,第一項和第二項分別是1,所以有公式,然後第三項為2,那麼有公式,此時k=3,則計算第乙個公式的平方結果是,結果正對,假設k=n-1時,公式成立,就有 =n-2
由fibonacci數列的遞推式可以得到=,因為計算的原因,公式中第二項和第四項不用代換,可以看出,這個結果就是與相乘的結果。故原式得證。
如果簡單第從0開始迴圈,n次方將需要n次運算,並不比前面的方法要快。但我們可以考慮乘方的如下性質:
/ an/2*an/2 n為偶數時
an= \ a(n-1)/2*a(n-1)/2 n為奇數時
要求得n次方,我們先求得n/2次方,再把n/2的結果平方一下。如果把求n次方的問題看成乙個大問題,把求n/2看成乙個較小的問題。這種把大問題分解成乙個或多個小問題的思路我們稱之為分治法。這樣求n次方就只需要logn次運算了。
實現這種方式時,首先需要定義乙個22的矩陣,並且定義好矩陣的乘法以及乘方運算。當這些運算定義好了之後,剩下的事情就變得非常簡單。完整的實現**如下所示。
[cpp]
#include
#include
struct matrix2by2
}; matrix2by2 matrixmultiply(const matrix2by2& matrix1,const matrix2by2& matrix2)
matrix2by2 matrixpower(unsigned int n)
else if(n%2==1)
return matrix;
} int fibonacci_solution(unsigned int n)
; if(n < 2)
return result[n];
matrix2by2 powernminus2 = matrixpower(n - 1);
return powernminus2.m_00;
} void main()
執行,能得到正確的結果。就像題目所說,給我fibonacci在我們計算機中的乙個應用吧,就是跳台階的問題。給定n個台階,有兩種選擇,就是一次可以跳乙個台階,還有是一次可以跳兩個台階。求總共有多少總跳法,並分析演算法的時間複雜度。把n級台階時的跳法看成是n的函式,記為f(n)。當n>2時,第一次跳的時候就有兩種不同的選擇:一是第一次只跳1級,此時跳法數目等於後面剩下的n-1級台階的跳法數目,即為f(n-1);另外一種選擇是第一次跳2級,此時跳法數目等於後面剩下的n-2級台階的跳法數目,即為f(n-2)。因此n級台階時的不同跳法的總數f(n)=f(n-1)+(f-2)。
我們把上面的分析用乙個公式總結如下:
/ 1 n=1
f(n)= 2 n=2
\ f(n-1)+(f-2) n>2
如果有三種選擇就是一次可以分別跳1,2,3,次的話,這個遞推式就可以寫成:f(n)=f(n-1)+f(n-2)+f(n-3).
Fibonacci數列與跳台階問題
乙個台階總共有n級,一次可以跳一格,也可以跳兩格,問總共有多少種跳法。以f n 表示n級台階的跳法總數。n 1時,只有一種跳法,一次跳一格。n 2時,有兩種跳法。跳法1 跳兩步每次一格 跳法2 跳一步兩格。當n較大時,從最後一步到達第n格只有兩種方法。跳法1 最後一步跳一格,所以需要知道f n 1 ...
斐波那契數列(跳台階)
題目1 斐波那契數列 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項 從0開始,第0項為0 n 39 斐波那契數列定義 1 1 2 3 5 8 13 21 34 我們最容易想到的是遞迴的方式,如下 public int fibonacci int n if n 1 re...
跳台階問題 斐波那契數列
本篇文章有兩道題。對於本題,前提只有 一次 1階或者2階的跳法。a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n 1個台階,跳法是f n 1 b.假定第一次跳的是2階,那麼剩下的是n 2個台階,跳法是f n 2 c.由a b假設可以得出總跳法為 f n f n 1 f n 2...