• 复习十:栈与递归的实现


    1、n阶Hanoi塔问题

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

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

    二、栈与递归

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

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

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

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

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

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

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

  • 相关阅读:
    .NET C#基础(6):命名空间 - 组织代码的利器
    flutter 使用 hive 遇到的错误
    Android FileProvider笔记
    spring boot在idea中热部署自动更新
    PHP导出word方法(一phpword)
    Python JSON
    使用 Redis BitMap 实现签到与查询历史签到以及签到统计功能(SpringBoot环境)
    Linux服务器(RedHat、CentOS系)安全相关巡检shell脚本
    Linux磁盘管理
    【RocketMQ】RocketMQ 5.0新特性(二)- Pop消费模式
  • 原文地址:https://blog.csdn.net/yyy_zxc/article/details/126870238