1. 程式人生 > >函數的遞歸調用

函數的遞歸調用

函數的遞歸調用 BE 直接 分析 png 其中 公式 定義 sca

/* 函數的遞歸調用:在調用一個函數的過程中又出現直接或間接地調用該函數本身,稱為函數的遞歸調用

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。

技術分享圖片

函數的遞歸調用