蓝桥杯练习题 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

比较不错的学习人工智能学习网站,各个知识点也讲的很不错:人工智能学习教程

题目
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

样例输入
10
样例输出
55

样例输入
22
样例输出
7704

两种方式解决:

第一种递归,但是对于较大的数可能会超时
第二种使用迭代,对于时间复杂度为O(n)

第一种使用递归:

#include <iostream>
using namespace std;

int  fib(int n)
{
	if(n==1)   //第一个出口
		return 1;
	else if(n==2) //第二个出口
		return 1;
	else return fib(n-1)%10007+fib(n-2)%10007;  //因为递推公式为Fn=Fn-1+Fn-2,所以出口会有两个
	//但是会有大量的重复运算,导致大数据运算会超时
}

int main()
{
	int n;
	cin>>n;
	cout<<fib(n);
	return 0;
} 

注意:使用递归的话,内存空间不会占太大,但是时间复杂度会很大,很容易输入n过大而导致超时,复杂度为O(2^n)。


第二种使用迭代

#include <iostream>
using namespace std;
int main()
{
	int n;
	cin>>n;
	long long a[n];
	a[0] = 1,a[1] = 1;
	//直接使用迭代这样的话时间复杂度为O(n),这样的话不会超时,但是如果n大的话,空间复杂度会更大,以空间换时间
	//数组存储的话下标  0  1   2  3  4  5  6  7  8  9
	//分别对应数为     1   1   2  3  5  8 13 21 34 55
	for(int i=2;i<n;i++){
		a[i] = (a[i-2]+a[i-1])%10007;
	}
	cout<<a[n-1]<<endl;
	return 0;
} 

注意:这里是创建了数组并且不断保存之前的数据,而不像递归那样有着大量的重复运算,空间换取时间,时间复杂度为O(n)。

题目总结
对于这道题,更好解决方法应当使用迭代,而不是用递归,递归用于解决较复杂问题会产生更好的效果


我是长路,感谢您的收看。
欢迎关注我的公众号:长路Java,其中会包含软件安装等其他一些资料,包含一些视频教程以及学习路径分享。
也可以加群:891507813 我们可以一起探讨学习

  • 17
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

长路 ㅤ   

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值