递归
函数直接或间接的调用自己
阶乘
#include<stdio.h>
int main(void)
{
int val;
int i,mult,s;
mult =1;
printf("请输入一个数字:");
printf("val=");
scanf("%d",&val) ;
for(i=1;i<=val;i++)
{
mult=mult*i;
}
printf("%d的阶乘是:%d\n",val,mult);
}
//假定n的值是1或大于1的值
long f(long n)
{
if(1==n)
return 1;
else
return f(n-1)*n;
}
汉诺塔
#include<stdio.h>
void hnt(int n,char A,char B,char C)
{
if(1==n)
{
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
}
else
{
hnt(n-1,A,C,B);
printf("将编号为%d的盘子直接从%c柱子移到%c柱子\n",n,A,C);
hnt(n-1,B,A,C);
}
}
int main(void)
{
char ch1='A';
char ch2='B';
char ch3='C';
int n;
printf("请输入你要移动的盘子数:");
scanf("%d",&n);
hnt(n,'A','B','C');
return 0;
}
调用过程
-
将所有的实际参数和返回地址的信息发送给被调函数保存
-
被调函数的局部变量分配空间
-
保存--释放--返回
先调用后返回,不管如何调用步骤一模一样,压栈再出栈,永远在栈顶
递归满足的三个条件
-
必须要有一个终止条件
-
值在递增,但规模在递减
-
这个转化必须可解
循环和递归
递归易于理解,但是速度慢,存储空间大