算法精解----递归(基本递归)

在看到了书之后,发现基本递归的确在调用的时候的确开辟了很多栈空间,如果计算量比较大的话,可能就的确很消耗系统资源,也影响计算效率。

下面示例是计算一个数的阶乘,比如4!=24  = 1x2x3x4。一些同学看了之后坑定会觉得很简单,马上一个for循环解决问题,如下:

int fact_2(int n)
{
	int i = 1;
	int result = 1;
	if (n <= 0)
		return 0;
	if (n == 1)
		return 1;
	for (i = 1; i <= n; i++)
	{
		result *= i;
	}
	return result;
}
恩....的确,这也是解决问题的方法,但这并不是我们要说的,为啥要用求阶乘的示例,因为对帮助理解递归函数有帮助,比较直观。

所以,请大家不要纠结为啥不用上面方法或者其他方法。

如下,是基本递归方式:

int fact(int n)
{
	if (n <= 0)
		return 0;
	if (n == 1)
		return 1;
	return n*fact(n-1);
}

配上阶乘计算方法,很多人就觉得,原来递归这么简单。其实不然,递归我们真正的使用的时候,一定要用到两个步骤,递推和回归,也许这就是叫递归的原因吧。

下面我们来递推一下4!的递推过程:

fact(4)
	->4*fact(3)
		->3*fact(2)
			->2*fact(1)
				->1
如上,当我们输入参数4的时候,4其实现在还不能马上计算出4的阶乘,他还要等待3的阶乘计算完成,计算3的阶乘之前还要计算2的阶乘,计算2的阶乘之前,还要计算1的阶乘,其中1的阶乘就是1.那么我们的递推过程完成,下面我们进行回归过程:

				->1
			<-2*1 = 2
		<-3*2 = 6
	<-4*6 = 24
24
递归有个规则就是递推成功,回归也要成功,如果递推可以,但是回归错误的话,这个递归算法是错误的。如上,当我们最后参数为1的时候,就可以进行回归操作了,回归到2的时候2*1=2,在回归到3的时候3*2!=3*2=6,回归到4的时候4*3!=4*6=24.所以最后的答案是4!,能够正常回归。这么多文字描述,我们来看看VS调用的时候,栈空间是怎样的呢。如下:

图片11.png


图片12.png


图片13.png


图片14.png


图片15.png


图片16.png


图片17.png


图片18.png



上面的图片展示了一个递归算法的栈空间使用情况,显示一个个入栈,然后到截止条件的时候,一个个出栈,然后得到最后的答案。


问题,从上面我们也看到了,如果我们计算次数比较多的话,使用的栈空间也会比较多的。这里是4!,如果是100!,那么栈调用过程更加繁琐,入栈出栈过程更加频繁,那么将会大大降低系统的运行效率。











  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值