递归和非递归分别实现求第n个斐波那契数

本文探讨了斐波那契数列的生成原理及其与生兔子问题的关系,通过递归与非递归两种算法实现,对比了两者在时间和空间上的效率差异。

斐波那契数列:1 1 2 3 5 8 13 21……(第三项是前两项之和)
生兔子问题:一对兔子,第三个月,能够再生一对兔子。假设每次都是生的一对(一公一母),并且兔子不会死。请问第n个月一共有几对兔子

//递归
#include<stdio.h>
#include<stdlib.h>
int count = 0;
int Fib(int n){
		if (n == 1 || n == 2){
		return 1;
	}
		if (n == 3){
			count++;
		}
	return Fib(n - 1) + Fib(n - 2);
}
int main(){
	printf("%d\n", Fib(5));
	printf("%d\n", count);
   system("pause");
   return 0;
}
//非递归
#include<stdio.h>
#include<stdlib.h>
int Fib(int n){
	if (n == 1 || n == 2){
		return 1;
	}
	int last1 = 1;//第n-1项
	int last2 = 1;//第n-2项
	int cur = 0;//第i项
	for (int i = 3; i <= n; i++){
		cur = last1 + last2;
		last2 = last1;
		last1 = cur;
	}
	return cur;
}
int main(){
	printf("%d\n", Fib(5));
   system("pause");
   return 0;
}

在这个问题中,我们清楚的看出使用递归比循环耗费了更长的时间,所以总结如下:
通常情况下,解决同一个问题,使用循环的时间低于使用递归的时间,使用循环的空间开销要低于递归的空间开销!
因为函数调用是有开销的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值