在调用一个函数的过程中出现直接或间接调用该函数的本身,就成为函数的递归调用。C语言的特点之一就在于允许递归调用。假设有一个函数f(),在调用函数f的过程中,又要调用f函数,这就叫直接调用本函数;如果在调用f的过程中,要调用函数f1,而在f1中又要调用f,这就是间接调用本函数。
关于递归的概念,可以用一个通俗的例子来说明:
有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁;问第4个人,他说比第3个人大2岁;问第3个人,他说比第2个人大2岁;问第2个人,他说比第1个人大2岁;问第1个人,他说他10岁。那么我们要求第5个人的年龄,可以根据第1个人的年龄,逐步回推过去,得到第5个人的年龄为18岁。
用程序来表达上述的问题如下:
#include<stdio.h>
int age(int n)
{
int c;
if(n == 1)
{
c = 10;
}
else
{
c = age(n-1) + 2;
}
return c;
}
int main(void)
{
printf("%d\n",age(5));
}
关于递归调用,还有一个例子是求数的阶乘。我们知道,n!=1*2*3*...*n。我们可以把它理解为n!=n*(n-1)!。根据这个,我们可以写出如下的程序:
#include<stdio.h>
int main(void)
{
int fac(int); //用于求阶乘的函数
int n;
printf("input a number:");
scanf("%d",&n);
printf("%d\n",fac(n));
return 0;
}
int fac(int n)
{
int a;
if(n<0)
{
printf("error data\n");
}
if(n==0||n==1)
{
a = 1;
}
else
{
a = fac(n-1)*n;
}
return a;
}
还有一个经典的例子是汉诺塔例子。汉诺塔问题就是移动圆盘的问题。具体问题的内容不在描述。用代码将它实现:
#include<stdio.h>
void move(char x, char y) //模拟盘子的移动
{
printf("%c--->%c\n",x,y);
}
void hanoi(int n,char one, char two, char three) //n是盘子的个数,one,two,three代表三根柱子
{
if(n==1)
{
move(one,three);
}
else
{
hanoi(n-1, one, three, two);
move(one, three);
hanoi(n-1, two, one, three);
}
}
int main(void)
{
int n;
printf("input numbers of dishes:");
scanf("%d",&n);
hanoi(n,'A','B','C');
}