函數的遞歸調用
/* 函數的遞歸調用:在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用
p185 例7.6 有5個學生坐在一起,問第5個學生多少歲,他說比第4個學生大2歲。問第4個學生歲數,他說
比第3個學生大2歲。問第3個學生,又說比第2個學生大2歲。問第2個學生,說比第1個學生大2歲。最後問
第1個學生,他說是10歲。請問第5個學生多大。
解題思路:要求第5個學生的年齡,須先求出第4個學生的年齡,第4個取決於第3個學生,第3個取決
於第2個,第2個取決於第1個。每一個學生的年齡都比起前一個學生大2。即:
age(5)=age(4)+2
age(4)=age(3)+2
age(3)=age(2)+2
age(2)=age(1)+2
age(1)=10
可用數學公式表述如下:
age(n)=10 (n=1)
age(n)=age(n-1)+2 (n>1)
*/
#include<stdio.h>
int main()
{
int age(int n);
printf("NO.5,age=%d\n",age(5)); //輸出第5個學生的年齡
return 0;
}
int age(int n) //定義遞歸函數
{
int c;
if(n==1) //如果n等於1
{
c=10; //年齡為10
}
else //如果n不等於1
c=age(n-1)+2; //年齡是前一個學生的年齡加2
return(c); //返回年齡
}
運行結果:
程序分析:main函數中實際上只有一個語句。整個問題的求解全靠一個age(5)函數調用來解決。調用過程如下圖所示
從上圖可以看到:age函數共被調用5次,即age(5)、age(4)、age(3)、age(2)、age(1)。其中age(5)是main函數調用的,
其余4次是在age函數中調用的,即 遞歸調用4次。
/* p187 例7.7 用遞歸方法求n!
解題思路:求n!可以用遞歸方法,即從1開始,乘2,再乘3……一直乘到n。
n!=n*(n-1)!
求n!也可以用遞歸方法,即5!=4!*5,4!=3!*4,…,1!=1。可用下面的遞歸公式表示:
n!=1 (n=0,1)
n*(n-1)! (n>1)
*/
#include<stdio.h>
int main()
{
int fac(int n); //fac函數聲明
int n;
int y;
printf("input an integer number:");
scanf("%d",&n); //輸入要求的階乘數
y=fac(n);
printf("%d!=%d\n",n,y);
return 0;
}
int fac(int n) //定義fac函數
{
int f;
if(n<0) //n不能小於0
printf("n<0,data error!");
else if(n==0||n==1) //n=0 或,1時 n!=1
f=1;
else f=fac(n-1)*n; //n>1時,n!=n*(n-1)
return(f);
}
運行結果:
程序分析:遞歸終止條件為n=0或n=1。
函數的遞歸調用