斐波那契数列问题的解决方法—函数递归部分

分享给大家斐波那契数列问题的解决主要是进行一下递归和循环的比较,补充一下在函数中的一些知识。

我们先上定义吧:

斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(≥ 2,∈ N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

给大家一张概述图

 如果有兴趣想要深入了解,可以去斐波那契数列_百度百科 (baidu.com)看看。

接下来就是问题啦。

请写一段代码,输入想要的第n个斐波那契数,程序运行后打印出这个数字。

这个问题有两种解法,一种是函数递归的方法,另一种是循环的方法。接下来分别给大家解决。

1,递归解法

思路分析:

我们要用函数递归的话,一定要想到递归的两个条件。1,存在限制条件,当满足限制条件时,递归便不再进行。2,每次递归后,越来越接近这个限制条件。就像青蛙跳台阶一样,我们写的函数求出的是第n个斐波那契数,而第n个斐波那契数是由第n-1个斐波那契数+第n-2个斐波那契数得到的,而第一个和第二个斐波那契数都是1,我们每次在递归的时候都是在进行数n的衰减(即每次递归传进去的数都是n-1或者n-2),当n=1或2时,我们就不需要再继续进行递归了,因为,这两个数不是由前两个数相加得到的。那么,限制条件自然也就有了,就是当n<=2时,返回1的值。

代码实现如下:

#include<stdio.h>
int Fac(int n)
{
	if (n <= 2)
		return 1;
	else
		return Fac(n - 1) + Fac(n - 2);
}
int main()
{
	int n = 0;
	printf("请输入想要的第n个斐波那契数:");
	scanf("%d", &n);
	int ret = Fac(n);
	printf("第%d个斐波那契数是:%d\n",n, ret);
	return 0;
}

这样就可以实现求取第n个斐波那契数,但是,这个代码存在一个效率低的问题,当你输入的斐波那契数过大时,代码运行的效率将会很低很低。分析一下,我们就会发现,每次递归的时候,很多数字会被重复计算,比如我们输入5,那么4递归,3递归,而4再进入时需求3递归和2递归,之前求的3递归是用不到这里的,而这个数字才5而已,当它更大的时候是不是更慢,需要重复计算的数字更多,浪费很多时间呢?效率太慢。

接下来是循环的部分。

我们同样先分析一下,我们发现,第n个斐波那契数列是由前两个数相加。我们是否可以用a,b来表示前两个数?用c来储存第3个数?即a表示第1个斐波那契数,b表示第二个斐波那契数,相加之后的第三个斐波那契数给c。那么这个时候,疑问来了,这样不是只能算一次吗?还记得前面我们学的变量的值交换吗?现在,a表示第1个斐波那契数,如果把b的值给a呢?对于第4个斐波那契数来说,a是不是又编程了第一个斐波那契数?把c的值给b,b又变成了下下个数的第二个斐波那契数,再相加,再给c,不断循环,不就能求出所要的斐波那契数了吗?

下面是博主自己画的一张图

代码实现如下

#include<stdio.h>
int Fac(int n)
{
	int a = 1;
	int b = 1;
	int c = 0;
	if (n <= 2)
		return 1;
	else
	{
		while (n>2)
		{
			c = a + b;
			a = b;
			b = c;
			n--;
		}
		return c;
	}
}
int main()
{
	int n = 0;
	printf("请输入想要的斐波那契数:");
	scanf("%d", &n);
	int ret = Fac(n);
	printf("第%d个斐波那契数是:%d",n,ret);
	return 0;
}

 这里其实可以不必写成函数的形式,但博主还是建议大家写成函数的形式,每个函数都有自己的功能,并且封装成函数也可以便利于其他人的使用。

注意:随着斐波那契数的增大,很有可能int类型不够储存了,如果要储存大的斐波那契数,大家一定要记得转变ret的类型。

这里再说说递归和循环,上次也和大家说过了,这次用实例让大家看看。

递归和循环的选择

1,两者都挺容易时,选熟练拿手的,但要保证都没问题。递归有栈溢出和效率慢的可能缺点。

2,两者有一者挺容易时,选容易的,当然也要保证没问题。

本篇博客到这里就结束啦,码字不易。看到这里不妨给博主点个赞,点个关注吧,我会坚持更新的。递归这部分大家要好好理解理解,后面写扫雷项目的时候还会再次使用到。

参考资料:

1,斐波那契数列_百度百科 (baidu.com)

2,斐波那契数列图片_百度百科 (baidu.com)

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值