斐波那契數列概念:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲「兔子數列」(來自百度百科)。具體可由如下公式表示:html
由上述公式可知,斐波那契數列存在兩個特殊值,即當n=0和n=1時,所以,可將n等於0與1時提出來做單獨處理,而剩下的部分再做單獨處理,基於這種想法,實現該目標可以使用兩種方法:函數
斐波那契數列是遞歸法最典型的一種體現,但又存在着不少的不足。spa
其中,遞歸的實現是經過調用函數自己,函數調用的時候,每次調用時要作地址保存,參數傳遞等,這是經過一個遞歸工做棧實現的。具體是每次調用函數自己要保存的內容包括:局部變量、形參、調用函數地址、返回值。那麼,若是遞歸調用 N 次,就要分配 N*局部變量、N*形參、N*調用函數地址、N*返回值,這勢必是影響效率的,該題目中,用遞歸方法計算的時間複雜度是以n的指數的方式遞增的,此段來自Edison Zhou的博文。code
以下代碼是使用遞歸實現的斐波那契數列(該題目中能夠看出,若你>1,計算f(n)須要不斷從新的調用Fibonacci函數):htm
class Solution{ public int Fibonacci(int n) { //當n小於等於0時,返回0 if (n <= 0) { return 0; } //當n等於1時,返回1 if (n == 1) { return 1; } //不然,返回前兩個數之和 else { return Fibonacci(n - 1) + Fibonacci(n - 2); } } }
很顯然,遞歸雖然能夠實現斐波那契數列,但卻存在着必定的問題。blog
因爲遞歸存在着效率低問題,爲解決該問題,引入循環的方法避免了遞歸法重複計算的弊端,從而運算的時間複雜度變爲是O(n)。遞歸
具體實現代碼以下:ci
class Solution { public int Fibonacci(int n) { // write code here int x = 0; int y = 1; int result = 0; if (n == 0) { return 0; } if (n == 1) { return 1; } else { for (int i=2;i<=n;i++) { result = x + y; x = y; y = result; } return result; } } }
上述代碼在實現上與遞歸法大同小異,不一樣點在於不須要重複的調用函數,我的感受理解起來更加容易一點。get