題目:
查找斐波納契數列中第 N 個數。
所謂的斐波納契數列是指:
前2個數是 0 和 1 。
第 i 個數是第 i-1 個數和第i-2 個數的和。
斐波納契數列的前10個數字是:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34 ...
樣例
給定1,返回0
給定2,返回1
給定10,返回34
分析
開始刷LintCode的第一道題,也是很基礎的一道題。
斐波那契數列經常用來講解遞歸的例子。
所以可以用遞歸的方法很方便的解決
遞歸
class Solution {
/**
* @param n: an integer
* @return an integer f(n)
*/
public int fibonacci(int n) {
// write your code here
if(n == 1)
{
return 0;
}
else if(n == 2)
{
return 1;
}
else
{
return fibonacci(n-1) + fibonacci(n-2);
}
}
}
這是用遞歸的方法解決,很清晰,幾乎是照搬了斐波那契數列的遞推式
但是遞歸算法的時間復雜度太高,提交之后并不通過
捕獲.PNG
非遞歸方法
所以需要嘗試非遞歸方法解決這個問題
class Solution {
/**
* @param n: an integer
* @return an integer f(n)
*/
public int fibonacci(int n) {
// write your code here
if(n == 1)
{
return 0;
}
else if(n == 2)
{
return 1;
}
else
{
int s1 = 0;
int s2 = 1;
int sum = 0;
int i = 3;
while(i <= n)
{
sum = s1 + s2;
s1 = s2;
s2 =sum;
i++;
}
return sum;
}
}
}
小結
以上就是斐波那契數列問題。
** 故不積跬步,無以至千里;不積小流,無以成江海 **
希望能慢慢堅持下去,從簡單到復雜的算法!