斐波那契数列的两种解法

斐波那契数列对于很多人来说可能并不陌生。笔者最近经常遇到这道题,这里针对这道题总结一下。

在目前的状态下,笔者已经探索出了两种不同的解决方案:首先,我们可以回顾一下之前设计的一种较为简陋的解决方案。这种方案的设计并不尽如人意,其占用的空间较大,而且在时间效率上也没有任何优势可言。现在我还掌握了一种新的解决方案,这种方式大大节约了空间。这种新的方法让我感到非常惊喜,好了,现在让我们开始正文。

这里还是先把问题再描述一遍吧

一个数列An,a0=0,a1=1,an=an-1+an-2,求这个数列的前n项

解法一

先简单介绍一下思路:

这里我使用数组来存储这个数列,所以需要定义一个很大空间的数组,在定义完数组后,我们需要保证输入的n在数组范围内。然后直接使用循环,根据递归数列,从a2一直算到an输出就可以了,下面将代码贴出:

ini 复制代码
#include <iostream>
using namespace std;

int main() {
	long int n;
	long int i;
	long long int* a = new long long int[1000000];
	cin >> n;	
	if (n < 1 || n>1000000)return -1;
	
	a[0] = 1; a[1] = 1;
	cout << a[0] << ' ' << a[1] << ' ';
	for (i = 2; i <= n; i++)
	{
		a[i] = a[i - 1] + a[i - 2];
		cout << a[i] << ' ';
	}
	delete[] a;

	return 0;
}

解法二

这里同样先介绍一下思路:

这里使用两个变量轮流存储数据,如起始时a0=0,a1=1;这时令a0存储第三个数据,a1存储第四个数据,以此类推。我们可以发现规律,第1个数据不满足n%2==0,用a0存储;第2个数据满足n%2==0,用a1存储;第三个不满足用a0存储;第四个满足用a1存储......为了记录数据可以在生成一个新数据时进行输出,下面将源码贴出:

ini 复制代码
#include<iostream>

using namespace std;

int main()
{
	int a0 = 0, a1 = 1;
	int n;
	cin >> n;
	cout << a0 << ' ' << a1 << ' '<<endl;
	for (int i = 3; i <= n; i++)
	{
		if (i % 2 == 0)
		{
			a1 = a0 + a1;
			cout << a1 << ' ';
		}
		else
		{
			a0 = a1 + a0;
			cout << a0 << ' ';
		}
		if (i % 5 == 0)
			cout << endl;
	}
}

总结

两种方式的转变应该算得上是我的成长了吧,哈哈哈哈,不管怎么说,这两种方式应该各有优劣,当然我现在更倾向于第二种。最后感谢阅读!!!

相关推荐
长大19881 分钟前
MySQL 慢查询排查完整流程
后端
苏三说技术35 分钟前
为什么越来越多人使用FastAPI?
后端
老孙讲技术1 小时前
业主半夜想看楼道监控,物业却说「去机房」?我用设备托管+轻应用,把小区摄像头嵌进了社区小程序
后端·物联网
geovindu1 小时前
CSharp: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·算法·c#·.net·搜索算法
二月龙1 小时前
什么是事务四大特性?用业务案例通俗讲透 ACID
后端
Slice_cy1 小时前
Mint 自研框架设计与实现:从重复开发走向配置驱动(五)
前端·后端·架构
景同学1 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端
神奇小汤圆2 小时前
MyBatis、MyBatis-Plus、通用 Mapper:一张图说清三者的血缘关系
后端
SamDeepThinking2 小时前
微信支付对接实战:从下单到回调的完整落地过程
后端·程序员·架构