有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子對數為多少?
兔子的規律為數列1,1,2,3,5,8,13,21 … ,屬於斐波那契數列問題。該數列有乙個規律: f(0) = 1 , f(1) = 1, f(n) = f(n-1) + f(n-2)(n>=2) …
由此可以用遞迴的方法實現,這樣寫出的**比較簡潔.
public class prog1
}public static long fun2(int n)
}}
這樣的遞迴演算法雖然只有簡單的幾行,但是效率卻很低。為什麼呢?我們可以分析其遞迴呼叫的時間複雜度:
時間複雜度—– o(2^n)
由於使用遞迴時,其執行步驟是:要得到後乙個數之前必須先計算出之前的兩個數,即在每個遞迴呼叫時都會觸發另外兩個遞迴呼叫,例如:要得到f(10)之前得先得到f(9)、f(8),那麼得到f(9)之前得先得到f(8)、f(7)……如此遞迴下去 。
這樣的計算是以 2 的次方在增長的。
除此之外,我們也可以看到,f(8)和f(7)的值都被多次計算,如果遞迴的深度越深,那麼f(8)和f(7)的值會被計算更多次,但是這樣計算的結果都是一樣的,除了其中之一外,其餘的都是浪費,可想而知,這樣的開銷是非常恐怖的 。
所以,如果在時間複雜度和空間複雜度都有要求的話,我們可以用以下的非遞迴演算法來實現。
時間複雜度為*o(n)*,空間複雜度為*o(1)*
思路:借助兩個變數 first 和 second ,每次將 first 和 second 相加後賦給 third ,再將 second 賦給 first ,third 賦給 second,如此迴圈。
public class prog1
}public static long fun(int n)
return third;
}}
遞迴實現斐波那契數列
斐波那契數列 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 在數學上與 分割的關係 ...
斐波那契數列遞迴實現
1.斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家萊昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 55 89 斐波納契數列在現代物理 準晶體結構 化學...