迭代
class Solution {
public:
int Fibonacci(int n) {
int first = 1;
int second = 1;
int third = 1;
while(n > 2)
{
first = second;
second = third;
third = first + second;
--n;
}
return third;
}
};
递归+剪枝
传统的递归算法,会有大量重复的计算,采取剪枝策略,对重复出现的计算进行保存。
class Solution {
private:
unordered_map<int, int> filtery;
public:
int Fibonacci(int n) {
if(n==0 || n==1)
return n;
if(n == 2)
return 1;
int ppre = 0; //n-2
if(filtery.find(n-2) == filtery.end())
{
// 没找到
ppre = Fibonacci(n-2);
filtery.insert({n-2, ppre});
}
else
{
ppre = filtery[n-2];
}
int pre = 0; //n-1
if(filtery.find(n-1) == filtery.end())
{
// 没找到
pre = Fibonacci(n-1);
filtery.insert({n-1, pre});
}
else
{
pre = filtery[n-1];
}
return pre + ppre;
}
};
递归展开图
以 n = 5为例: