开始之前,首先来看一个通常我们不会以递归的形式思考的问题。假设我们想计算整数n的阶乘。n的阶乘可写作n!,其结果是1~n之间的各数之积。比如,4!=4×3×2×1。一种计算法方法是循环遍历其中的每一个数,然后与它之前的数相乘作为结果再参与下一次计算。这种方法称为迭代法,可以正式定义为:
n! = (n)(n - 1)(n - 2) . . . (1)
看待这个问题的另一种方式是将n!定义为更小的阶乘形式。为了实现这一步,我们将n!定义为n-1阶乘的n倍。当然,求解(n-1)!的过程同n!一样,只是变小了一些。如果我们再把(n-1)!看做n-1倍的(n-2)!,(n-2)!看做n-2倍的(n-3)!,一直到n=1时,我们就计算完了。这就是递归的方式,可以正式定义为:
C语言实现递归的基本原理
图3-1展示了利用递归的方法计算的4!过程。它也勾画出了递归过程中的两个基本阶段:递推与回归。在递推阶段,每一个递归调用通过进一步调用自己来记住这次递归过程。当其中有调用满足终止条件时,递推结束。比如,在计算n的阶乘时,终止条件是当n=1和n=0,此时函数只须简单地返回1即可。每一个递归函数都必须拥有至少一个终止条件;否则,递推阶段就永远不会结束了。一旦递推阶段结束,处理过程就进入回归阶段,在这之前的函数调用以逆序的方式回归,直到最初调用的函数返回为止,此时递归过程结束。
C语言实现递归的基本原理
Figure 3.1. Computing 4! recursively
示例3-1展示了一个C函数fact,它接受一