一、定義
斐波那契數列:數列從第三項開始,每一項都等於前兩項之和。如1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,…
數學定義(遞迴):f0=0,f1=1,fn=fn-1+fn-2(n>=2,n∈n*)
二、實現
1、遞迴法
遞迴滿足2個條件:
1)有反覆執行的過程(呼叫自身)
2)有跳出反覆執行過程的條件(遞迴出口)
優點:程式呼叫自身的程式設計技巧,大問題化為小問題,可以極大的減少**量,**簡潔清晰,可讀性好
缺點:時間複雜度太大,隨著n的增大,運算時間將會急劇增加,遞迴太深容易造成堆疊的溢位。除了最後乙個數,每個數都被重複計算若干次。
2、迭代法
利用變數的原值推算出變數的乙個新值,迭代效率高,執行時間因迴圈次數增加而增加,**不如遞迴簡潔,編寫複雜問題時困難。
public class fibonacci
//遞迴
public static int fab(int n)else
}//迭代
public static int fab_iter(int n)else
return result;}}
}
其他相關問題
題目1: 青蛙跳台階問題。
乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個n級台階總共有多少種跳法。
分析: 我們將n級台階的跳法看作是n的函式,記為f(n)。
當n=1時,只有1種跳法;
當n=2時,有跳1次2階和跳2次1階的2種跳法;
當n>2時,第一次跳有兩種選擇:一種是第一次跳1階,此時跳法為後面剩下的n-1階,即為f(n-1);一種是第一次跳2階,此時跳法為後面剩下的n-2階,即為f(n-2)。
因此,由上面的分析可以看出n階的不同跳法的總數為f(n)=f(n-1)+f(n-2)。實際上就是斐波那契數列。
擴充套件:青蛙跳台改為青蛙可以一次跳1級台階,也可以2階,…,也可以n階。總共的跳法,最後用數學歸納法,可以證明:f(n)=2^(n-1)。
題目2: 矩形覆蓋問題
我們可以用2x1的小矩形橫著或者豎著去覆蓋更大的矩形。問用8個2x1的小矩陣無重疊地覆蓋乙個2x8的大矩陣,共有多少種方法?
分析: 我們將2x8的覆蓋方法記為f(8)。用第乙個小矩形覆蓋大矩形最左邊的時候,有兩種選擇:豎著放置或者橫著放置。
豎著放置的時候,右邊還剩下2x7的區域,記為f(7);
橫著放置的時候,左上角放置乙個,則對應的左下角必須還有乙個小矩陣,則右邊還剩下2x6的區域,記為f(6);
因此,f(8)=f(7)+f(6),可以看出,這仍然是斐波那契數列。
斐波那契數列的遞迴和迭代實現
遞迴 遞迴就是在函式裡面呼叫自身。遞迴主要可以分為兩個過程 遞推和回歸。所謂遞推就是把複雜的問題求解推到比原來問題簡單的一些問題的求解。回歸就是當獲得最簡單的問題後,逐步返回,依次得到複雜問題的解。迭代 迭代就是利用變數的原值推算出變數的乙個新值。遞迴實現 public class solution...
遞迴實現斐波那契數列
斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n package com.algorithm.tiger.recursion 遞迴和非遞迴方法實現斐波那契數列 斐波那契數列 f 1 1,f 2 1,f n f n 1 f n 2 n 3,n n descripti...
斐波那契數列遞迴實現
什麼是fibnacci數列?斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家萊昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 0 1 1 2 3 5 8 13 21 34 在數學上與 分割的關係 ...