某些函数的递归与非递归实现的比较

1.斐波那契数列实现~

  递归实现:

int fib(int n)
{
	if (n == 1 || n == 2)
		return 1;
	else
		return fib(n - 1) + fib(n-2);
}
非递归(迭代法)实现:
int fib(int n)
{
	int num1 = 1;
	int num2 = 1;
	int num3 = 1;
	while (n > 2)
	{
		/*num3 = num1 + num2;
		num1 = num2;
		num2 = num3;*///以上三句语句等价于下边两句,不过,这三句应该返回num3
		num1 = num1 + num2;
		num2 = num1 - num2;
		n--;
	}
	return num1;
}
从以上两种实现方法我们可以看出,递归代码比非递归简单很多~不过,你是否知道递归背后的故事~如果我们要计

算第40个斐波那契数,计算机需要计算很多次:每个递归调用都触发另外两个递归调用,而这俩个递归调用又将

触发递归调用。当我们计算fib(10)时,fib(3)被调用了21次,这个数目你可以在纸上推导。开销太大。

所以,从时间和空间复杂度来看,还是非递归的好一些~

2.字符串逆序~

非递归实现:

void reverse(char *left, char *right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
递归实现:
void reverse_string(char* str)
{
	int len = Strlen(str);
	if (len > 1)
	{
		char tmp = str[0];
		str[0] = str[len - 1];
		str[len - 1] = '\0';
		reverse_string(++str);
		str[len - 1] = tmp;
	}
}
分析:非递归实现方法比递归好很多,非递归代码简单易懂,递归代码实现原理:当字符串长度大于1,递归起来

,将第一个字符放到临时开辟的空间,最后一个字符放在第一个字符的位置,然后把原本放最后一个字符的位置清

为结束符,当递归结束时,把临时区的变量放在所谓的字符串的结尾~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值