3.3栈与递归的实现
一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称为递归函数。
(先说明下若在函数A中调用了函数B,则称函数A为调用函数,函数B为被调用函数)
当一个函数的运行期间调用另一个函数时,在运行被调用的函数之前,系统要完成3件事情
1.将所有的实参、返回地址等信息传递给被调用的函数保存。
2.为被调用函数的局部变量分配存储区。
3.将控制转移到被调用函数入口。
被调用函数返回调用函数之前也要完成3件工作。
1.保存被调用函数的计算结果。
2.释放被调用函数的数据区。
3.依照被调用函数保存的返回地址将控制转移到调用函数。
这时要通过栈来实现,系统将整个程序运行所需的数据空间安排在一个栈中,每当调用一个函数时,就为它在栈顶分配一个存储区,出栈就释放。
图3.6(c)主函数调用函数first,first再调用second
图3.6(a)当前正在执行函数second中某个语句时栈的状态
图3.6(b)second退出后正执行的函数first中某个语句时栈的状态
下面看看Hanoi塔的递归
下面对这个表做出解释:
这个表第列是运行语句行号:
代码如下:
void hanoi (int n, char x, char y, char z) { // // 将塔座x上按直径由小到大且至上而下编号为1至n的n个圆盘按规则搬到// 塔座z上,y可用作辅助塔座。// 搬动操作 move (x, n, z) 可定义为:// (c是初值为0的全局变量,对搬动计数)// printf("%i. Move disk %i from %c to %c\n", ++c, n, x, z);1
2 if (n==1)
3 move(x, 1, z); //将编号为1的圆盘从x移到z
4 else {
5 hanoi(n-1,x,z,y);
6 move(x, n, z); //将编号为n的圆盘从x移到z
7 hanoi(n-1, y, x, z); //将y上编号为1至n-1的圆盘移到z,x作辅助塔
8 }
9}
下面分析下代码和过程:
首先说明下,递归代码是非常巧妙的,基本上大家知道这个程序就可以了,考研的学生知道下原理,然后背下来,这个东西一般人是写不出的。
下面来说明下思路,这个算法的巧妙之处在于他用了几行的代码实现了Hanoi塔(感觉是废话)。
1.在第五步时,递归工作栈状态为 8,1,c,a,b
这个8是返回第八行,1,是第一块行,c,a,b,是把c移到b,并且a为辅助,那么为什么是1,c,a,b,这个1是因为第二块圆盘第6步执行完成后,第5部的时候第二块圆盘把x,z,y(也就是a,c,b)给了hanoi的参数,这样的话x=a,y=c,z=b,在第7步时就是c,a,b了。
2.在第五部里面,有move(x,1,z)这时,改变下次参数就是move(c,1,b)意思是把圆盘1从c移到b。
整个hanoi的代码上难点就在这,基本上这个大家理解下思路,会了这个思路过程就可以了。
3.3栈与递归的实现相关推荐
- 数据结构与算法:09 栈与递归
09 栈与递归 知识结构: 栈是我们经常使用的一种数据结构,比如,手枪发射子弹的顺序与子弹压入弹夹的顺序是相反,即后压入弹夹的子弹先发射出来.又比如,我们使用的Word.Excel.Photoshop ...
- Datawhale组队学习 Task03:栈与递归(2天)
Task03:栈与递归(2天) 栈是我们经常使用的一种数据结构,如下图所示,手枪发射子弹的顺序与子弹压入弹夹的顺序是相反,即后压入弹夹的子弹先发射出来. 比如我们使用的Word.Excel.Photo ...
- 第三章:3.栈和队列 -- 栈与递归的实现
前言: 栈还有一个总要应用是在程序设计语言中实现递归.一个直接调用自己或通过一系列的调用语句间接地调用自己的函数,称作递归函数. 目录: 1.栈 2.栈的应用举例 3.栈与递归的实现 4.队列 5.离 ...
- 九、【栈和队列】栈和递归
栈和递归 栈的另外一个重要应用就是在程序设计语言中实现递归. 1 递归 Recursion 简单来说,递归就是直接调用自身或通过一系列调用语句间接调用自身的一种编程技巧或方法,使用递归来实现的函数被称 ...
- LQ训练营(C++)学习笔记_栈与递归
栈与递归 二.栈与递归 1.栈的概念 2.代码实现栈的数据结构 3.栈stack< T >的方法总结 4.火车出入站问题 5.递归的概念 6.递归方法求n的阶乘 7.汉诺塔问题 二.栈与递 ...
- 算法9---二叉树的遍历不用栈和递归
二叉树的遍历不用栈和递归 转自:ACM之家 http://www.acmerblog.com/inorder-tree-traversal-without-recursion-and-without- ...
- 用栈和递归求解迷宫问题
一.问题概述 小时候,我们都玩过走迷宫的游戏吧.看一下这个图例: 遇到这种问题时,我们第一反应都会先找到迷宫的入口点,然后对上下左右四个方向进行寻迹, 检测当前位置是否是通路,是否可以通过,直至找到出 ...
- 数据结构之栈与递归的实现及应用(斐波拉契数列递归解法和strlen递归解法)
栈与递归 程序中的"函数调用栈"是栈数据结构的一种应用. 函数调用栈一般是从高地址向低地址增长的,栈底为内存的高地址处,栈顶为内存的低地址处. 函数调用栈中存储的数据为活动记录.活 ...
- 解题笔记(15)——几个栈和递归的问题
本文介绍了几个栈和递归的问题,当然递归的本质就是栈.这些问题网上都能找到解答,自己思考并实现了一下,供网友参考. 问题1:跳台阶问题.具体描述,一个台阶总共有n级,如果一次可以跳1级,也可以跳2级.求 ...
- 数据结构(C语言版)之栈及递归
目录 前言 正文 一.栈 1.栈的概念及术语 1.定义 2.逻辑结构 3.存储结构 4.运算规则 5.实现方式 6.栈是一种特殊的线性表,它的逻辑结构和存储结构与线性表相同,其特殊性体现在" ...
最新文章
- 那还剩下多少学习激情?
- 与 Josh Bloch 探讨 Java 未来
- websocket趣说_转
- Android短消息备份闪退,Android Socket发送信息时闪退
- ST17H26对接RC522读IC卡
- 使用Spring+Junit4.4进行测试
- 安卓平板运行python_使用Python进行手机平板移动开发 | 学步园
- 通过Java和Spring Boot应用程序将Gmail用作SMTP服务器
- c++ 带参数的宏定义实现反射机制
- spring mvc 重新定向到一个新的Url
- 白板推导系列Pytorch实现-感知机算法
- 力扣-1641. 统计字典序元音字符串的数目
- Windows10照片查看器
- c54x汇编语言程序设计,第5章 apos;C54x汇编语言程序设计.doc
- 由《资深架构师带你玩转框架封装》课程——我的实践
- 使用python自动玩游戏
- centos误删除后文件恢复
- 无法打开ONEDRIVE的解决方法【等待验证】
- KUBERNETES安装及访问web页面
- 4.STM32F407之HAL库——按键
热门文章
- 佛说 :程序员你与我有缘。
- FineReport 11.0 全新大屏模式,打开3D视界,大屏制作更快
- s3k3 破旧不堪的拐杖被扔出去几米远
- 秋高气爽FreeEIM
- 飞秋 包括《java就业培训课程》
- FTP常用的73个基本用法:
- 这几张图告诉你程序员的变化,最后一张图扎心了
- 经典面试题(4):use strict 有什么意义和好处?
- python闭包应用实例_Python中的闭包详细介绍和实例
- 这个大部分CNS都会用到的技术分析流程大放送......