fibonacci數列和跳台階問題

2021-12-29 16:30:38 字數 2447 閱讀 9324

首先百度之後知道,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...