函数的递归调用

/* 函数的递归调用:在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用

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 ",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,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。

 

原文地址:https://www.cnblogs.com/ddhdd/p/8639200.html