递归5--汉诺塔问题的栈实现
递归5--汉诺塔问题的栈实现
汉诺塔的递归解法:http://www.cnblogs.com/Renyi-Fan/p/6949515.html
一、心得
系统里面的递归就是靠栈来维护的,
区别我们普通栈的是维护递归的那个栈有返回地址
递归每深入一层,栈顶元素加一
递归每退出一层,栈顶元素减一
返回地址是执行完这一层,返回到上一层的地址
就是从栈里面取元素然后操作这个元素,如此循环往复,和队列操作几乎完全一样
然而这里用队列不得行,因为最前面的问题分解的子问题没有放在队列最前面
二、分析
三、代码及结果
1 /* 2 汉诺塔问题的栈实现 3 f(n)=f(n-1)+1+f(n-1) 4 Problem(n,'A','B','C')=Problem(n-1,'A','C','B')+Problem(1,'A','B','C')+Problem(n,'B','A','C') 5 队列不得行,因为最前面的问题分解的子问题没有放在最前面 6 */ 7 #include <iostream> 8 #include <stack> 9 using namespace std; 10 11 struct Problem{ 12 int n; 13 char src,mid,dest; 14 Problem(int nn,char s,char m,char d):n(nn),src(s),mid(m),dest(d){ 15 } 16 };//一个Problem变量代表一个子问题,将src上的n个盘子 17 //一mid为中介,移动到dest 18 stack<Problem> stk;//用来模拟递归的栈,一个元素代表依次操作 19 //若有n个盘子,则栈的高度不超过n*3,因为出来一个数,进去三个数 20 int main(){ 21 int n; 22 cin>>n; 23 stk.push(Problem(n,'A','B','C'));//初始化第一轮操作 24 while(!stk.empty()){//只要栈中还有数据,就接着处理 25 Problem curPrb=stk.top();//取最上面的那个子问题,即当前问题 26 stk.pop();//因为要对刚刚那个子问题进行操作,所以让子元素直接出栈 27 if(curPrb.n==1) cout<<curPrb.src<<"->"<<curPrb.dest<<endl; 28 else{ 29 //分解子问题,子问题要逆序放,因为栈是先进后出 30 //先把分解得到的第三个子问题放入栈中 31 stk.push(Problem(curPrb.n-1,curPrb.mid,curPrb.src,curPrb.dest)); 32 //再把第二个子问题放入栈中 33 stk.push(Problem(1,curPrb.src,curPrb.mid,curPrb.dest)); 34 //最后放第一个子问题, 后放入栈的子问题先被处理 35 stk.push(Problem(curPrb.n-1,curPrb.src,curPrb.dest,curPrb.mid)); 36 37 } 38 } 39 return 0; 40 }
转载于:https://www.cnblogs.com/Renyi-Fan/p/6955068.html
递归5--汉诺塔问题的栈实现相关推荐
- C++非递归解决汉诺塔问题
汉诺塔问题简述:将塔A上的n个大小不一的盘子借由塔B全部移动到塔C上,且在过程中不能将大盘子放在小盘子上. 目录 1.算法: 2.具体效果: 3.SeqStack.c ...
- c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑
c语言递归解决汉诺塔参数变化的疑惑 答案:3 信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...
- Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏
Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 目录 输出结果 核心代码 输出结果 核心代码 def hanoi(n,x,y,z):if n==1:print(x,'--→',z) ...
- Python递归实现汉诺塔
Python递归实现汉诺塔: def f3(n,x,y,z): if(n==1):print(x,'--->',z)else:f3(n-1,x,z,y)print(x,'--->',z)f ...
- c语言递归解决汉诺塔问题
c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.
- c语言 统计数量用count_C语言编程学习之递归实现汉诺塔图解!还有零基础入门视频~...
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- C语言——生存期和存储类型、递归、递归求解汉诺塔、快速排序
目录 一.生存期和存储类型 1.生存期 2.存储类型 3.自动变量(auto) 4.寄存器变量(register) 5.静态局部变量(static) 6.static 和 extern 二.递归 1. ...
- python实现汉诺塔递归经典算法_Python递归实现汉诺塔算法示例
本文实例讲述了Python递归实现汉诺塔算法.分享给大家供大家参考,具体如下: 最近面试题,面试官让我5分钟实现汉诺塔算法(已然忘记汉诺塔是啥). 痛定思痛,回来查了一下汉诺塔的题目和算法.题干与实现 ...
- 2.2基本算法之递归和自调用函数_用栈算法递归解决汉诺塔问题
今天博主收一下线性表的尾,最近我们要学习的内容是栈和队列板块,栈和队列板块分为两讲,第一讲也就是今天我们主要学习栈的相关知识,包括栈的定义.栈的顺序表示及实现,栈的链式表示,栈的应用举例,以及栈递归实 ...
- ICS计算系统概论LC3汇编实验Lab5—中断、递归解决汉诺塔问题
Lab Purpose 完成用户程序的编写. 编写下面描述的键盘中断服务例程. condition: 用户程序: 汉诺塔的参数,记录为N,将用xFFFF初始化并存储在X3FFF内存中. 您的用户程序从 ...
最新文章
- Codeforces 359D Pair of Numbers | 二分+ST表+gcd
- MATLAB字符数组和空数组
- 10-Bootstrap Checksedit
- python代码怎么运行_使用Joblib并行运行Python代码
- JNI调用两层C++动态库
- 11gR2 Grid Infrastructure Installation prerequisites On LINUX
- VSCode调试Python时终端输出中文乱码解决方法1
- NVM:使用NVM后报错npm:command not found
- 【Python】Python IDLE 设置清屏功能(清屏快捷键Ctrl+w,亲测通用)
- 根据小米商城官网首页效果敲写页面
- MCE | 线粒体和能量代谢的关系
- Coprime Triples——CodeChef - COPRIME3
- SIGIR'22 | 阿里 ESCM^2: 升级版全空间多任务转化率预估
- 【AE-MG动画全套学习教程】After Effects CC MG动画高效学习视频全套
- 点集拓扑学(1)——度量空间
- 9月17日服务器维护,《海岛纪元》9月17日维护公告 「失落之城」正式开服
- SaaS应用价值存巨大争议
- C++常用数据结构或技巧
- Windows AutoPilot简介转载学习
- 华为社招嵌入式软件面试_华为OD社招面试(技术二面完)--总结复盘
热门文章
- ffmpeg 花屏的问题
- 目标追踪-背景差算法
- linux黑板模式,敲黑板!怎样使用 Linux stat 命令创建灵活文件列表?
- python怎么做软件程序_Revit二次开发python怎么做?人工智能python语言在BIM软件高效建模的运用尝试...
- 【Flink】Flink flink-runtime.version.properties generated correctly. You MUST run mvn generate-source
- 【flink】RocksDB介绍以及Flink对RocksDB的支持
- 【kafka】InconsistentGroupProtocolException: The group member‘s supported protocols
- 【SpringCloud】Spring cloud Alibaba Sentinel 热点规则
- 【算法】BloomFilter 与 CuckooFilter
- 【Mac】Mac下SSH免密登录localhost