【编程】递归函数

递归函数

定义:即自调用函数,在函数体内部自己调用自己,即函数的嵌套调用函数本身。

机制: 函数不能嵌套定义但能嵌套调用,且调用函数和被调用函数相互独立;

发生函数调用时,被调用函数保存了调用函数的入口地址和参数,可在函数调用完成后返回;

被调函数运行的代码虽是同一个函数的代码体,但由于调用点,调用时状态, 返回点的不同,可以看作是函数的一个副本,与调用函数的代码无关,所以函数的代码是独立的。

被调函数运行的栈空间独立于调用函数的栈空间

递归调用的形式

直接调用和间接调用

递归的条件

(1)须有完成函数任务的语句。-->return (n*p);

(2)—个确定是否能避免递归调用的测试,如果不满足条件,就不进行递归调用。-->if(n<=1) return (1);

(3)一个递归调用语句。   
  该递归调用语句的参数应该逐渐逼近不满足条件,以至最后断绝递归。-->fact(n-1);

(4)先测试,后递归调用。,递归调用是有条件的,满足了条件后,才可以递归。  

递归调用--栈的引用

根据栈的“先进后出”的性质,外围的函数调用的地址和返回参数先入栈,嵌套的函数依次入栈,等到出栈。

经典递归--汉诺塔


解析

将n-1个盘子移动到空出来的塔,然后将第n个盘子移动的目标塔c塔。

#include <stdio.h>  
//第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔  
int i=1;//记录步数  
void move(int n,char from,char to) //将编号为n的盘子由from移动到to  
{printf("第%d步:将%d号盘子%c---->%c\n",i++,n,from,to);  
}  
void hanoi(int n,char from,char denpend_on,char to)//将n个盘子由初始塔移动到目标塔(利用借用塔)  
{  
    if (n==1)  
    move(1,from,to);//只有一个盘子是直接将初塔上的盘子移动到目的地  
    else  
    {  
      hanoi(n-1,from,to,denpend_on);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上  
      move(n,from,to);              //将剩下的一个盘子移动到目的塔上  
      hanoi(n-1,denpend_on,from,to);//最后将借用塔上的n-1个盘子移动到目的塔上  
    }  
}  
void main()  
{  
     printf("请输入盘子的个数:\n");  
     int n;  
     scanf("%d",&n);  
     char x='A',y='B',z='C';  
     printf("盘子移动情况如下:\n");  
     hanoi(n,x,y,z);  
}  


参考资料:

http://www.cnblogs.com/seaven/archive/2010/12/17/1908953.html

http://wenku.baidu.com/link?url=StcdAzAwIw1aeyQvWChXvMyG04yBgZljnd2UaJIPp4rkqOhz20wah0Mpdo4fpjqYDNrEicjdPcWVSuvXfg6tmQQN_-K_910PcuoLbCLgncG

http://blog.csdn.net/kkkkkxiaofei/article/details/8333644/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值