函数的递归调用
标签: C语言
学习人数: 10.7k

一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。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 针移动 ...

登录查看完整内容


课后作业

掌握本节内容


登录后开始许愿

暂无评论,来抢沙发