C 语言实现斐波那契数列,解决递归实现缺陷(算法)

39 篇文章 0 订阅
27 篇文章 0 订阅

何为斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,其斐波那契数列数列从第3项开始,每一项都等于前两项之和。



概况

既然明确斐波那契数列确定基本算法 如果你要求第n个斐波那契数列**n=n-1+n-2**

提示:以下是本篇文章正文内容,下面案例可供参考

一、递归实现函数

int Fib(int n) {
	if (n>=2)
	{
		return Fib(n - 1) + Fib(n - 2);
	}
	else
	{
		return 1;
	}

}

原理 :

每次递归传入的值都是n-1和n+2的值,直到n>=2
为什么说 n>=2要跳出循环,因为2的前面只有1,会最终导致程序少多加负数,所以要跳出来,2过了就是返回1即可





如果你觉得这样就行了得话,
你是没有见过如果使用这个递归算法
那将计算起来有多么的消耗计算速度 例如你要求第100斐波那契数 套入公式n=(n-1)+(n-2) 那你得先求出第99,和第98
而第99个又需要第98和第97个
而求第98个又需要第97和第96的
如果一直往下... ...
那么越是低位你数字你会发现计算重复次数越来越多 如图计算一个3的重复计算次数。。emmm计算100的时候我的电脑开飞机一般,所以不演示了我就计算第30个斐波那契数列里的3被重复计算的次数
if (n==3)
	{
		count++;
	}
	if (n>=2)
	{
		return Fib(n - 1) + Fib(n - 2);
	}
	else
	{
		return count;
		

	}

![在这里插入图片描述](https://img-blog.csdnimg.cn/20200823215921413.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0FsaWNlc2E=,size_16,color_FFFFFF,t_70#pic_center)
所以这种方法不可取



二、交换位置方法

代码如下

int Fib(int n) {
	int a = 1;
	int b = 1;
	int c = 1;

	while (n>2)
	{
		c = a + b;
		a = b;
		b = c;
		n--;	
		printf("%d\n", c);
	}
	return c;
}

原理:

在斐波那契实列里
1,1 ,2,3,5,8,13,21,。。。。。
先用a存1b存1a+b的结果2存给c
然后讲a的值给b,c(结果值)给b,
然后进入下一轮的时候
先用a存1b存2a+b的结果3存给c
然后再讲a的值给b,c(结果值)给b,
一步一步…
这的时候这个时候的数字被重复计算的次数就不存在了在这里插入图片描述

当然你也可以这样写

return (x > 0 ? f(n - 1) + f(n - 2) : 1);

数列方式

int a = 0, b = 1, c = 0, n = 0, s = 50, arr[50];
	arr[0] = 1;

	while (s--)
	{
		c = a + b;
		a = b;
		b = c;
		arr[n] = c;
		n++;

	}
	int i = 1, j = 4;
	int sz = sizeof(arr) / 4 - 1;
	while (sz--)
	{
		j--;
		if (j == 0)
		{
			j = 4;
			printf("\n");
		}
		printf("%d ", arr[i]);
		i++;

	}

总结

当然万变不离其宗,斐波那契数的算法依旧是 n=n-1+n-2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值