编写函数,使用循环代替递归计算斐波那契数列

递归就是函数自己调用自己,递归方案虽然简洁,但是效率却没有循环高。递归虽然为某些编程问题提供了最简单的解决方案,但一些递归算法会快速消耗计算机的内存资源。递归也不方便阅读和维护。
以斐波那契数列来举例。我们首先定义一个Fibonacci()函数。

unsigned long Fibonacci(unsigned n)
{
	if (n>2)
		return Fibonacci(n-1) + Fibonacci(n-2)
	else
	return 1;
}

在这个函数中,每级递归创建的变量都是上一级递归的两倍,所以变量的数量呈指数增长。很快就消耗掉计算机的大量内存,很可能导致程序的崩溃。所以在考虑效率优先的程序时,使用递归要特别注意。
于是我们考虑用循环代替递归计算斐波那契数。
在此我使用的是for循环。

#define _CRT_SECURE_NO_WARNINGS//VS编译器
#include<stdio.h>
//循环代替递归计算斐波那契数列
void Fibonacci(int n);

int main(void)
{
	int n;
	scanf("%d", &n);
	Fibonacci(n);
	
	return 0;
}

void Fibonacci(int n)
{
	int n1 = 1, n2 = 1;
	printf("1 1 ");
	for (int i = 3;i <= n;i++)
	{
		int n3 = n1 + n2;
		n1 = n2;
		n2 = n3;
		printf("%d ", n3);
	}
}

一般而言,选择循环比较好。首先,每次递归都会创建新的变量,所以递归会使用更多的内存,递归调用的数量受限于内存空间。其次,每次函数调用都会花费一定的时间,所以递归执行的速度较慢。
当然递归也有递归的优点,有它存在的意义。在写代码的时候要具体情况具体分析,选择递归还是选择循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值