递归之---汉诺塔
2015-12-26 21:56
253 查看
递归思想的概念:即将一个复杂问题分解成一系列小的问题,并且这些小问题都具有相同的情形。
此时可运用递归的思想来解决更易于理解(但并不一定是效率最高的哦);
递归算法有三个关键点:
(1)了解题意是否适用递归来解决;
(2) 有明确的终止条件(通常是分解出来的一系列小问题里最简单的那种情况);
(3) 随着递归算法的演进,数据规模在递减,决定递归执行部分;
设计思路:
我们可以定义出圆盘原先所在桩为“来源桩”(from),铁盘预以往"目的桩(to)",而另一个桩为“辅助桩(auxiliary)”当圆盘为三个时,
需把圆盘一移往目的桩,再把圆盘二移往辅助桩,把圆盘一移到辅助桩圆盘二上,然后把圆盘三移到目的桩。。。。。。.
以此类推,可知当未移往目的桩的圆盘数为1时,则将最后所剩的铁盘移至目的桩,即完成工作。
否则,
(1)将前N-1个圆盘从源桩移往辅助桩;
(2)将编号为N的铁盘从源桩移往目的桩;
(3)将前N-1个圆盘从辅助桩移往目的桩。
此时可运用递归的思想来解决更易于理解(但并不一定是效率最高的哦);
递归算法有三个关键点:
(1)了解题意是否适用递归来解决;
(2) 有明确的终止条件(通常是分解出来的一系列小问题里最简单的那种情况);
(3) 随着递归算法的演进,数据规模在递减,决定递归执行部分;
设计思路:
我们可以定义出圆盘原先所在桩为“来源桩”(from),铁盘预以往"目的桩(to)",而另一个桩为“辅助桩(auxiliary)”当圆盘为三个时,
需把圆盘一移往目的桩,再把圆盘二移往辅助桩,把圆盘一移到辅助桩圆盘二上,然后把圆盘三移到目的桩。。。。。。.
以此类推,可知当未移往目的桩的圆盘数为1时,则将最后所剩的铁盘移至目的桩,即完成工作。
否则,
(1)将前N-1个圆盘从源桩移往辅助桩;
(2)将编号为N的铁盘从源桩移往目的桩;
(3)将前N-1个圆盘从辅助桩移往目的桩。
int step_number; void move(char x,char y,int number) { step_number++; printf("The step %d:",step_number); printf("move disk %d from %c to %c\n",number,x,y); } void hanoi(int n,char from,char auxiliary,char to) { if(n==1) move(from,to,1); else{ hanoi(n-1,from,to,auxiliary); move(from,to,n); hanoi(n-1,auxiliary,from,to); } } void main() { int disk_number; printf("The power of Hanoi program.\n"); printf("please enter the number of disks:"); scanf("%d",&disk_number); printf("The step to moving %d diskes:\n",disk_number); hanoi(disk_number,'A','B','C'); printf("step_number = %d", step_number); }
相关文章推荐
- 通讯录
- mysql5.7.10 zip windows安装
- LT29i刷机方法
- 如何删除Oracle数据库
- 最小生成树
- 行编辑程序
- Hbuilder连接模拟器调试
- sed命令
- Java中类的加载机制---父类和子类的多态调用
- 鸽巢算法
- 鸽巢算法
- 观《恶棍天使》后感
- 手机CPU各大厂商以及手机 cpu架构体系分类
- 编译安装httpd-2.2.29.tar详解
- 【Python笔记】Python多线程进程如何正确响应Ctrl-C以实现优雅退出
- UI - UISegmentedControl、UISlider、UIImageView、UISwitch
- oracle 导入导出
- http相关---多线程下载文件
- Volley--慕课网学习
- <《巴菲特之道 (第三版)》>读书笔记