斐波那契數列的非遞迴實現

2022-10-06 22:27:20 字數 1019 閱讀 6580

有一對兔子,從出生後第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 斐波納契數列在現代物理 準晶體結構 化學...