一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
例如有函数 f 如下:
int f(int x)
{
int y;
z = f(y);
return z;
}
这个函数是一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条件判断,满足某种条件后就不再作递归调用,然后逐层返回。下面举例说明递归调用的执行过程。
【例】用递归法计算 n!
用递归法计算 n!可用下述公式表示:
n! = 1 (n = 0, 1)
n×(n - 1)! (n > 1)
按公式可编程如下:
#include <stdio.h>
long ff(int n) {
long f;
if(n < 0) printf("n<0,input error");
else if(n == 0 || n == 1) f = 1;
else f = ff(n - 1) * n;
return(f);
}
int main() {
int n;
long y;
printf("input a inteager number:\n");
scanf("%d", &n);
y = ff(n);
printf("%d!=%ld", n, y);
return 0;
}
程序中给出的函数 ff 是一个递归函数。主函数调用 ff 后即进入函数 ff 执行,如果 n<0,n==0 或 n=1 时都将结束函数的执行,否则就递归调用 ff 函数自身。由于每次递归调用的实参为 n-1,即把 n-1 的值赋予形参 n,最后当 n-1 的值为 1 时再作递归调用,形参 n 的值也为 1,将使递归终止。然后可逐层退回。
下面我们再举例说明该过程。设执行本程序时输入为 5,即求 5!。在主函数中的调用语句即为 y=ff(5),进入 ff 函数后,由于 n=5,不等于 0 或 1,故应执行 f=ff(n-1)*n,即 f=ff(5-1)*5。该语句对 ff 作递归调用即 ff(4)。
进行四次递归调用后,ff 函数形参取得的值变为 1,故不再继续递归调用而开始逐层返回主调函数。ff(1)的函数返回值为 1,ff(2)的返回值为 1*2=2,ff(3)的返回值为 2*3=6,ff(4)的返回值为 6*4=24,最后返回值 ff(5)为 24*5=120。
上例也可以不用递归的方法来完成。如可以用递推法,即从 1 开始乘以 2,再乘以 3…直到 n。递推法比递归法更容易理解和实现。但是有些问题则只能用递归算法才能实现。典型的问题是 Hanoi 塔问题。
【例】Hanoi 塔问题
一块板上有三根针,A,B,C。A 针上套有 64 个大小不等的圆盘,大的在下,小的在上。如图所示。要把这 64 个圆盘从 A 针移动 ...
掌握本节内容
登录后开始许愿
好难=。= 没看懂