复习十:栈与递归的实现

1、n阶Hanoi塔问题

void hanoi(int n,char x,char y,char z)
    //将塔座X上按直径由小到大且自上到下编号为1至n的n个圆盘按规则搬到塔座z上,y可用作辅助塔座
    //搬动操作move(x,n,z)可定义为:printf("%i.Move disk %i from %c to %c\n",++c,n,x,z);
    //c是初始值为0的全局变量,对搬动计数
{
    if(n=1)
        move(x,1,z);    //将编号为1的圆盘从x移到z
    else{
        hanoi(n-1,x,z,y);    //将x上n-1个圆盘搬到y上,z作辅助塔
        move(x,n,z);    //将第n个盘子从x移动到z上
        hanoi(n-1,y,x,z);    //将y上n-1个盘子搬到z上,x作辅助塔
    }
}

「递归练习」汉诺塔_哔哩哔哩_bilibili

二、栈与递归

一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数

若在函数A中调用了函数B,则称函数A为调用函数,称函数B为被调用函数。

当在一个函数的运行期间调用另一个函数时 

运行被调用函数之前,系统需先完成3件事从被调用函数返回调用函数之前,系统也需先完成3件事
1、将所有的实在参数、返回地址等信息传递给被调用函数保存1、保存被调函数的计算结果
2、为被调用函数的局部变量分配存储区2、释放被调函数的数据区
3、将控制转移到被调函数的入口3、依照被调函数保存的返回地址将控制转移到调用函数

当有多个函数构成嵌套调用时,按照“后调用先返回”的原则

【一个递归函数的运行过程类似于多个函数的嵌套调用,只是调用函数和被调用函数时同一个函数】

每一层递归所需信息构成一个“工作记录”,其中包括所有的实在参数、所有的局部变量以及上一层的返回地址。每进入一层递归,就产生一个新的工作记录压入栈顶。每退出一层递归,就从栈顶弹出一个工作记录,则当前执行层的工作记录必是递归工作栈栈顶的工作记录,称这个记录为“活动记录”,并称指示活动记录的栈顶指针为“当前环境指针”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值