带备忘录的递归—->斐波那契数列

###题目:
斐波那契数列
已知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;
}
’‘’

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值