靳润昭C语言教程讲义 2001年2月17日 86函数的递归调用 个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允 许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自 身,每调用一次就进入新的一层 例如有函数f如下: 这个函数是一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。 为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条 件判断,满足某种条件后就不再作递归调用,然后逐层返回。下面举例说明递归调用的执行 过程 【例8.5】用递归法计算n 用递归法计算n!可用下述公式表示 (n=0,1) 按公式可编程如下 long ff(int n) if(n<0) printf("n<0, input error") else f=ff(n-1)*n return(f) main int n printf( input a integer number: \n") scanf(%d", &n) ff(n) printf("%d!=%ld n, y) 程序中给出的函数ff是一个递归函数。主函数调用ff后即进入函数f执行,如果 n<0,n==0或n=1时都将结束函数的执行,否则就递归调用f函数自身。由于每次递归调用 的实参为n-1,即把n-1的值赋予形参n,最后当n1的值为1时再作递归调用,形参n的值 第10页靳润昭 C 语言教程讲义 2001 年 2 月 17 日 第10页 8.6 函数的递归调用 一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言允 许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自 身,每调用一次就进入新的一层。 例如有函数 f 如下: int f(int x) { int y; z=f(y); return z; } 这个函数是一个递归函数。但是运行该函数将无休止地调用其自身,这当然是不正确的。 为了防止递归调用无终止地进行,必须在函数内有终止递归调用的手段。常用的办法是加条 件判断,满足某种条件后就不再作递归调用,然后逐层返回。下面举例说明递归调用的执行 过程。 【例 8.5】用递归法计算 n! 用递归法计算 n!可用下述公式表示: n!=1 (n=0,1) n×(n-1)! (n>1) 按公式可编程如下: 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); } main() { int n; long y; printf("\ninput a inteager number:\n"); scanf("%d",&n); y=ff(n); printf("%d!=%ld",n,y); } 程序中给出的函数 ff 是一个递归函数。主函数调用 ff 后即进入函数 ff 执行,如果 n<0,n==0 或 n=1 时都将结束函数的执行,否则就递归调用 ff 函数自身。由于每次递归调用 的实参为 n-1,即把 n-1 的值赋予形参 n,最后当 n-1 的值为 1 时再作递归调用,形参 n 的值