題目描述
大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項爲0)。n<=39
題目分析
首先理解什麼是斐波那契數列:即f(1) = 1 ,f(2) = 1,f(n) = f(n-1) +f(n-2)
同樣,實現方法也有兩種:1、自底向上實現,2、遞歸實現
方法一:自底向上實現
class Solution {
public:
int Fibonacci(int n) {
//f(1) = 1 ,f(2) = 1,f(n) = f(n-1) +f(n-2)
//自底向上實現
if(n == 0)
{
return 0;
}
if(n >0 && n <= 2)
{
return 1;
}
int f1 = 1;
int f2 = 1;
int sum =0;
for(int i =3;i<=n;i++)
{
sum = f1 + f2;
f1 = f2;
f2 = sum;
}
return sum;
}
};
方法二:遞歸實現
class Solution {
public:
int Fibonacci(int n) {
//遞歸實現
if (n == 0)
return 0;
else if(0 < n && n<=2 )
return 1;
else
{
return Fibonacci(n-1) + Fibonacci(n-2);
}
}
};
仔細分析一下,上面遞歸實現的流程:
求f(n)時需要計算f(n-1)與f(n-2),求f(n-1)時需要計算f(n-2)與f(n-3),是不是f(n-2)重複計算了一次,同理,後續所有元素都有重複計算,繼續優化一下。
備忘錄法:巧用數組下標實現狀態保存。
1、創建備忘錄數組result,並全部初始化爲0。
2、每次計算f(n)前先查詢數組,若爲0,則遞歸計算並將計算結果存入result[n]。
class Solution {
public:
int result[40] = {0};
int Fibonacci(int n) {
//遞歸實現
if (n == 0)
return 0;
else if(0 < n && n<=2 )
return 1;
else
{
if(result[n] != 0)
//return result[n];
else
{
result[n] = Fibonacci(n-1) + Fibonacci(n-2);
return result[n];
}
}
}
};