思想
说起斐波那契数列,相比学过计算机和数学的都肯定了解过。之前大家一般都是用递归写,时间复杂度为 O ( 2 n ) O(2^{n}) O(2n),效率低下。要是用一维数组存储已经计算的则时间复杂度为O(n),空间复杂度为O(n),感觉还算不错。而迭代的写法能在此基础上将空间复杂度将至O(1)。
代码
#include<iostream>
using namespace std;
int fib(int n)
{
if(n < 1)
return 0;
if(n == 1 || n == 2)//特殊值无需迭代】
return 1;
int f1 = 1,f2 = 1,fn = 0;//迭代变量
for(int i = 3;i <= n;i++)//用i的值来限制迭代的次数
{
fn = f1 + f2;
f1 = f2;//f1和f2迭代前行,注意先f2再f1
f2 = fn;
}
return fn;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d",fib(n));
return 0;
}
输入
10
输出
55
总结
这个经典算法,记录一下,嗯,就是这样!