演算法 神奇的斐波那契數列

2021-09-29 05:51:20 字數 2495 閱讀 2889

2023年,義大利數學家leonardo fibonacci提出了這樣乙個問題:在最佳條件下,一年裡,一對兔子能繁殖多少對兔子?這個理論實驗規定,母兔總是生下成對的兔寶寶,每對由一公一母組成。兩隻新生的兔子被安置在乙個有圍欄的院子裡,然後讓像正常兔子一樣繁殖。長到乙個月才能開始繁殖,所以第乙個月只有一對兔子。在第二個月月底,母兔產下兩隻兔子。當第三個月到來時,原來的一對兔子又產了一對新生兒,而它們早期的後代則已經成年。此時便留下了三對兔子,其中兩對將在下個月再生兩對兔子。

每個月的兔子對數為:1,1,2,3,5,8,13,21,34,55,89,144。這個數列從第3項開始,每一項都等於前兩項之和,這個數列被命名為斐波那契數列。如果取數列前兩個元素為1,那麼遞推關係就是:f(n)=f(n-1)+f(n-2)。曾經有一度數學家們將0作為斐波那契數列的首項(或第0項)。

菲波拉契數列問題可以有兩種方式實現: 遞迴演算法、迴圈演算法。

優點:**簡潔、清晰,並且容易驗證正確性。

缺點:1、它的執行需要較多次數的函式呼叫,如果呼叫層數比較深,每次都要建立新的變數,需要增加額外的堆疊處理,會對執行效率有一定影響,占用過多的記憶體資源。

2、遞迴演算法解題的執行效率較低。在遞迴呼叫的過程中系統為每一層的返回點、區域性變數等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等

注意:遞迴就是在過程或函式裡呼叫自身;使用遞迴策略時要注意的幾個條件:

1、必須有乙個明確的遞迴結束條件,稱為遞迴出口。

2、遞迴需要有邊界條件、遞迴前進段和遞迴返回段。

3、當邊界條件不滿足時,遞迴前進。當邊界條件滿足時,遞迴返回。

優點:速度快,結構簡單。

缺點:並不能解決所有的問題。有的問題適合使用遞迴而不是迴圈。如果使用迴圈並不困難的話,最好使用迴圈。

題目1:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?

分析:第1個月: 1對兔子 , 第2個月  1對兔子。

第3個月:新生一對兔子,共有2對兔子,其中1對兔子年齡》=3,1對兔子年齡==1,簡單表示為:1(3)/0(2)/1(1),括號外表示兔子數量,括號內數字表示兔子年齡。

第4個月:夠3個月齡的兔子生一對,不夠3個月的年齡+1(若達到3,可以生兔子), 1(3)/1(2)/1(1),共3對兔子。

第5個月:有一對兔子剛剛達到3個月齡,加上已經達到3個月齡的,共有2對兔子可以生小兔子,2(3)/1(2)/2(1),共5對兔子。

找規律,按月份列出兔子數量(多少對):1,1,2,3,5...,   這是乙個菲波拉契數列問題

題目2:青蛙跳台階問題,乙隻青蛙一次可以跳上1級台階,也可以跳上2級台階。求該青蛙跳上乙個n級台階總共有多少種跳法?

分析:當n = 1, 只有1中跳法;當n = 2時,有2種跳法;當n = 3 時,有3種跳法;當n = 4時,有5種跳法;當n = 5時,有8種跳法;.......規律類似於fibonacci數列:  1, 2, 3, 5, 8...

題目3:青蛙**跳台階問題,乙隻青蛙一次可以跳上1級台階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上乙個n級的台階總共有多少種跳法。

分析:先跳到n-1級,再一步跳到n級,有f(n-1)種;

先跳到n-2級,再一步跳到n級,有f(n-2)種;

先跳到n-3級,再一步跳到n級,有f(n-3)種;

先跳到第1級,再一步跳到n級,有f(1)種;

所以:f(n)=f(n-1)+f(n-2)+f(n-3)+···+f(1), f(n-1)=f(n-2)+f(n-3)+···+f(1), 推出f(n)=2*f(n-1)

public class fblqs 

return recursion(num-1) + recursion(num-2); }

/*** 菲波拉契數列 - 迴圈實現

* * @param num 月數量

* @return

*/public static int circulate(int num)

for (int i = 3; i <= num; i++)

return f2; }

/*** 青蛙**跳台階問題

* 演算法:f(n) = 2*f(n-1)

* * @param num

* @return

*/public static int jumpfloor(int num)

int jumpnum = 2;

for (int i = 3; i <= num; i++)

return jumpnum; }

public static void main(string args)

}

Python 神奇的斐波那契數列

斐波那契數列又叫做 兔子數列 分割數列 由數學家列昂納多 斐波那契以兔子繁殖為例子引出.它指的是這樣的乙個數列 1,1,2,3,5,8,13,21,34.這個數列從第三項開始,每一項的值就是前兩項值的和,所以它的簡單表示式就是 f 1 1 f 2 1 f n f n 2 f n 1 n 2 在pyt...

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...

迴圈斐波那契數列 斐波那契數列應用

什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...