递归

递归

函数直接或间接的调用自己

阶乘

 #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; 
 }
 ​

 

调用过程

  1. 将所有的实际参数和返回地址的信息发送给被调函数保存

  2. 被调函数的局部变量分配空间

  3. 将控制转移到被调函数的入口

保存--释放--返回

先调用后返回,不管如何调用步骤一模一样,压栈再出栈,永远在栈顶

递归满足的三个条件

  1. 必须要有一个终止条件

  2. 值在递增,但规模在递减

  3. 这个转化必须可解

循环和递归

递归易于理解,但是速度慢,存储空间大

不易理解,但是速度快,不浪费时间

posted @ 2022-04-28 21:31  Unclesundada  阅读(13)  评论(0)    收藏  举报