###题目:
斐波那契数列
已知F(1)=F(2)=1;
n > 3时,F(n) = F(n - 1) + F(n- 2)
输入n,求F(n),n <= 100000,结果对1e9+7取模。
###初步代码(不带备忘录的递归)
正常来说,对于比较小的输入会比较快,但是如果输入的数足够大,运行将会十分地慢。
原因:上述递归构成一颗搜索数—->结点数约为2^ n个—-> 时间复杂度O(n)约为2^n 。
解决方案:使用带备忘录(数组存下计算过的结果)的递归—->计算过的斐波那契数列的那一位就不会再重复计算—->相当于每位只做一次计算操作—->时间复杂度O(n)约为n。
现在我们可以输入一个很大的数字,运行会非常快。
代码如下:
‘’‘
#include<bits/stdc++.h>
using namespace std;
using ll=long long;//声明ll为longlong型
const ll k=1e9+7;//后续取模对象
const int N=1e5+9;
ll demo[N];
//自定义计算斐波那契数列的函数
ll fib(int n)
{
if(demo[n])
return demo[n];
//如果这一位已经计算过(demo[n]存在),那么就直接返回,不再重复计算
if(n<=2)return 1;
demo[n]=(fib(n-1)+fib(n-2))%k;
return demo[n];
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;++i)
cout<<fib(i)<<endl;
return 0;
}
’‘’