基础算法 —— 递归/递推 —— 汉诺塔问题(Hanoi)
【问题提出】
Hanoi塔由n个大小不同的圆盘和三根木柱a,b,c组成。开始时,这n个圆盘由大到小依次套在a柱上,如图所示。
要求把a柱上n个圆盘按下述规则移到c柱上:
(1)一次只能移一个圆盘;
(2)圆盘只能在三个柱上存放;
(3)在移动过程中,不允许大盘压小盘。
问将这n个盘子从a柱移动到c柱上,总计需要移动多少个盘次?
【问题解答】
解:设Hn为n个盘子从a柱移到c柱所需移动的盘次。
显然,当n=1时,只需把a 柱上的盘子直接移动到c柱就可以了,故:H1=1。
当n=2时,先将a柱上面的小盘子移动到b柱上去,然后将大盘子从a柱移到c柱,最后,将b柱上的小盘子移到c柱上,共记3个盘次,故:H2=3。
以此类推,当a柱上有n(n>=2)个盘子时,总是先借助c柱把上面的n-1个盘子移动到b柱上,然后把a柱最下面的盘子移动到c柱上,再借助a柱把b柱上的n-1个盘子移动到c柱上,总共移动H(n-1)+1+H(n-1)个盘次。
∴Hn=2H(n-1)+1,边界条件:H1=1
【递推实现】
#include<stdio.h>
int ct=1;//记录步数,在步骤中输出
void move(int n,char from,char to)
{printf("第 %2d 步:把第 %d 个盘子: %c >>>>>>> %c\n",ct++,n,from,to);
}
int hanoi(int n)//输出步数:
{int cnt = 2,ans = 1;if(n == 1)return 1;elsereturn 2* hanoi(n-1) +1;
}
void hanoi_tower(int n,char x,char y, char z) //输出步骤
{if(n==1)move(1,x,z);else{hanoi_tower(n-1,x,z,y);move(n,x,z);hanoi_tower(n-1,y,x,z);}
}
int main()
{int n;//盘子个数printf("输入盘子个数:\n");scanf("%d",&n);char x = 'A',y = 'B',z = 'C';int t = hanoi(n);printf("一共需要%2d步。\n",t);hanoi_tower(n,x,y,z);return 0;
}
【递归实现】
#include<stdio.h>
void move(int n, char x, char y, char z)//将n个圆盘从x柱子上借助y柱子移动到z柱子上
{if(n == 1)printf("圆盘编号 %d :从 %c 移动到 %c\n",n,x,z);else{move(n-1,x,y,z);printf("圆盘编号 %d:从 %c 移动到 %c\n",n,x,z);move(n-1,y,x,z);}}
int main()
{int n;//n代表圆盘的个数/*A,B,C分别代表三个柱子*/char ch1 = 'A';char ch2 = 'B';char ch3 = 'C';printf("请输入圆盘的个数:");scanf("%d",&n);move(n,ch1,ch2,ch3);return 0;
}
基础算法 —— 递归/递推 —— 汉诺塔问题(Hanoi)相关推荐
- C语言递归小游戏—汉诺塔(hanoi)
前言: 汉诺塔大家都不陌生吧,在猩球崛起这个电影里,人们通过凯撒玩汉诺塔知道了它的智商增高了,这个益智小游戏的规则就是: 汉诺塔(Tower of Hanoi),又称河内塔.是一个源于印度古老传说的益 ...
- 递归巧解汉诺塔问题(hanoi)
/* hanoi问题:在source处的盘子通过help处到达target source:一开始所处的位置 help:盘子可以借助的地方 target:到达的地方 n:盘子的个数 */ void ha ...
- 深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。
目录 序言: 一.函数递归( recursion) 二.递归的两个必要条件 三.递归小问题 (1)接受一个整型值(无符号),按照顺序打印它的每一位 (2)编写函数不允许创建临时变量,求字符串的长度(利 ...
- “三色河内塔”算法(三色汉诺塔)
问题引入 "三色河内塔"由"河内之塔"的规则衍生而来(点击查看),区别在于三色河内塔的目的是将图1所示的圆盘位置,移动成为图2所示的圆盘位置."三色河 ...
- 递归(二)-------经典递归实例(汉诺塔问题)
2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章讨论一个经典的递归实例(Fibonacy数列问题),现在来讨论一下另外一个经典的递归例子:汉诺塔问题: 问题描述:在 ...
- 算法第一期:汉诺塔问题(python通俗易懂版)
问题描述: 汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面 ...
- 递归和循环----汉诺塔
题目: 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵 ...
- Bailian4147 汉诺塔问题(Hanoi)
4147:汉诺塔问题(Hanoi) 总时间限制: 1000ms 内存限制: 65535kB 描述 一.汉诺塔问题 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小. ...
- 汉诺塔(Hanoi Tower)
问题分析 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. ...
最新文章
- Eclipse快捷键归纳及整理
- React系列---React+Redux工程目录结构划分
- SDUT - 2623 The number of steps(概率dp)
- java线程分类_Java 线程类别
- ceph-deploy install时,远端节点在执行apt-get update命令时失败
- java 多数据源处理_java – 用于处理多个数据源的Spring事务管理
- shell 进入hadoop_Hadoop关于HDFS的基本操作(Shell命令)
- 标题在图表上_图与表,让你的图表更简单清晰易读,告诉你怎么设置图表
- go get如何删除_Go语言HTTP请求(req库)
- iOS上传应用到AppStore出现Authenticating with the iTunes store
- Mysql解压版配置环境等
- ~~~~练习~~~~用户登录(三次机会重试)
- 利用dialogArguments进行网页页面传值
- 数学建模之回归分析加例题详解(MATLAB实现)
- MMORPG端游《ELYON》12月10日上线 采用买断式收费方式
- oracle remap schema,impdp的remap_schema选项的另一个schema是否要重建
- python sklearn svm_文本分类和预测 sklearn.svm.LinearSVC(1)
- QQ 简洁模式切换失败解决方法
- Galera Cluster 实现mysql群集
- birthday中文是什么_birthday中文怎么读
热门文章
- creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器
- SQL 查找是否存在,别再 count 了,很耗费时间的!
- 春节!免费送出一个佳能相机!
- 天鼎:一个技术人在世界读书日的遐想
- 设置Java JDK的默认编码为UTF-8
- Activiti 学习记录1 inclusiveGateway与 exclusiveGateway的区别
- CDP客户数据管理平台体系化搭建
- 算法工程师面试题【集锦cv/ml/dl】
- 倒排索引、分词、同义词
- 【跃迁之路】【706天】程序员高效学习方法论探索系列(实验阶段463-2019.1.26-27)...