演算法學習-03-斐波那契數列 和 跳臺階
阿新 • • 發佈:2021-01-29
技術標籤:演算法總結
演算法學習-03-斐波那契數列 和 跳臺階-C++
題目1:斐波那契數列
**:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0,第1項是1)。
- 輸入:4
- 輸出:3
- 分析:斐波那契數列的定義是:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),也就是說第三項等於前兩項的和,而當為0項為0,第1項為1,同理知第2項為1,第3項為2,第4項時為3。因此,我們可以採用遞迴的方法。
遞迴方法:
C++程式碼實現
int Fibonacci(int n) {
if (n == 1 || n == 2) return 1;
if(n == 0) return 0;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
- 但是使用遞迴的方法,當n過大的時候,可能會造成遞迴過深的問題(上面程式碼是尾遞迴形式,一般來說編譯器會自動優化,因此不用擔心棧溢位的問題)。並且,呼叫遞迴的方法明顯執行速度會比較慢
,因此我們也可以採用非遞迴的方法。
非遞迴的方法:
C++程式碼實現
int Fibonacci(int n) {
if(n == 0) return 0;
if(n == 1 || n == 2) return 1;
//n1代表n-2,n2代表n-1 ,因此如果需要計算
//第n項,我們只需要第n-2項加n-1項。
int n1 = 1, n2 = 1, ans;
for(int i = 3; i <= n; i++){
//計算第i項
ans = n1 + n2;
//更新n1和n2,使之成為i-1和i-2項
n1 = n2;
n2 = ans;
}
return ans;
}
題目2:跳臺階:
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
- 輸入1:1
- 輸出1:1
- 輸入2:4
- 輸入2:5
- 分析:跳臺階與斐波那契數列的問題類似,因為如果要跳上第n階臺階,可以從第n-1階臺階一次條一級臺階,或者從第n-2階臺階一步跳兩級臺階,因此跳上第n階臺階的可能方法數量就是跳上n-1階臺階和n-2階臺階所有可能方法數量之和。所以我們同樣可以採用遞迴和非遞迴的方法實現。
C++實現程式碼
//非遞迴方法
int jumpFloor(int number) {
if(number <= 2){return number;}
int pre1 = 2, pre2 = 1;
for(int i = 3;i <= number;i++){
int temp = pre1 + pre2;
pre2 = pre1;
pre1 = temp;
}
return pre1;
}
//遞迴方法
int jumpFloor(int number) {
if(number == 1){return 1;}
if(number == 2){return 2;}
return jumpFloor(number-1)+jumpFloor(number-2);
}
執行時間對比(牛客網的執行時間)
斐波那契數列
遞迴的方法
非遞迴的方法
跳臺階
遞迴的方法:
非遞迴的方法