算法精解-C语言描述 递归和尾递归 (图解+实例)


递归是一种强大的方法,它允许一个对象以其自身更小的形式来定义自己。

让我们来观察一下自然界中出现的递归现象:蕨类植物的叶子,每片叶子叶脉中的小分支都是整片叶子的较小缩影;又或者两个反光的物体,相互映射对方渐远的影像。这样的例子使我们明白,尽管大自然的力量是强大的,在许多方面它那种出乎意料的简洁更让我们觉得优美。同样的道理也可以用在递归算法上,从很多方面来说递归算法都是简洁而优美的,而且非常强大。

在计算机科学领域中,递归是通过函数来实现的。递归函数是一种可以调用自身的函数。

基本递归

假设我们想计算整数n的阶乘。n的阶乘可能写作n!,其结果是1~n之间的各数之积。比如,4!=4 x 3 x 2 x 1。一种方法是循环遍历其中的每一个数,然后与它之前的数相乘作为结果再参与下一次计算。这种方法称为迭代法,可以正式定义为:

n! = n(n-1)(n-2)...(1)

看待这个问题的另一种方式是将n!定义为更小的阶乘形式。我们将n!定义为n-1阶乘的n倍。再把(n-1)!定义为n-1倍的(n-2)!,(n-2)!看作(n-2)倍的(n-3)!,一直到n=1时,我们就计算完了。这就是递归的方式,可以正式定义为:


1
如果 n=0,n=1
f(n)=



nf(n)
如果 n>1

4!的递归树

图1: 以递归的方式计算4的阶乘


上图(1)展示了利用递归计算4!的过程。它也说明了递归过程中的两个基本阶段:递推和回归。在递推阶段,每一个递归调用通过进一步调用自己来记住这次递归过程。当其中有调用满足终止条件时,递推结束。比如,在计算n!时,终止条件是当n=1和n=0,此时函数只需简单的返回1即可。每一个递归函数都必须拥有至少一个终止条件;否则递推阶段永远不会结束了。一旦递推阶段结束,处理过程就进入回归阶段,在这之前的函数调用以逆序的方式回归,直到最初调用的函数为止,此时递归过程结束。

以递归的方式计算n的阶乘的函数实现:

C函数fact的工作方式如下:它接受一个整数n作为参数,如果n小于0,该函数直接返回0,这代表一个错误。如果n等于0或1,该函数返回1,这是因为0!和1!都等于1,以上是终止递归的条件。否则,函数返回n-1的阶乘的n倍。而n-1的阶乘又会以递归的方式再次调用fact来计算,如此继续。

代码实例(1):fact.c
  • 15
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值