【问题提出】

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)相关推荐

  1. C语言递归小游戏—汉诺塔(hanoi)

    前言: 汉诺塔大家都不陌生吧,在猩球崛起这个电影里,人们通过凯撒玩汉诺塔知道了它的智商增高了,这个益智小游戏的规则就是: 汉诺塔(Tower of Hanoi),又称河内塔.是一个源于印度古老传说的益 ...

  2. 递归巧解汉诺塔问题(hanoi)

    /* hanoi问题:在source处的盘子通过help处到达target source:一开始所处的位置 help:盘子可以借助的地方 target:到达的地方 n:盘子的个数 */ void ha ...

  3. 深度理解递归,手撕经典递归问题(汉诺塔,青蛙跳台阶),保姆级教学。

    目录 序言: 一.函数递归( recursion) 二.递归的两个必要条件 三.递归小问题 (1)接受一个整型值(无符号),按照顺序打印它的每一位 (2)编写函数不允许创建临时变量,求字符串的长度(利 ...

  4. “三色河内塔”算法(三色汉诺塔)

    问题引入 "三色河内塔"由"河内之塔"的规则衍生而来(点击查看),区别在于三色河内塔的目的是将图1所示的圆盘位置,移动成为图2所示的圆盘位置."三色河 ...

  5. 递归(二)-------经典递归实例(汉诺塔问题)

    2019独角兽企业重金招聘Python工程师标准>>> 上一篇文章讨论一个经典的递归实例(Fibonacy数列问题),现在来讨论一下另外一个经典的递归例子:汉诺塔问题: 问题描述:在 ...

  6. 算法第一期:汉诺塔问题(python通俗易懂版)

    问题描述: 汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面 ...

  7. 递归和循环----汉诺塔

    题目: 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵 ...

  8. Bailian4147 汉诺塔问题(Hanoi)

    4147:汉诺塔问题(Hanoi) 总时间限制: 1000ms 内存限制: 65535kB 描述 一.汉诺塔问题 有三根杆子A,B,C.A杆上有N个(N>1)穿孔圆盘,盘的尺寸由下到上依次变小. ...

  9. 汉诺塔(Hanoi Tower)

    问题分析 汉诺塔问题是一个经典的问题.汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说. 大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘. ...

最新文章

  1. Eclipse快捷键归纳及整理
  2. React系列---React+Redux工程目录结构划分
  3. SDUT - 2623 The number of steps(概率dp)
  4. java线程分类_Java 线程类别
  5. ceph-deploy install时,远端节点在执行apt-get update命令时失败
  6. java 多数据源处理_java – 用于处理多个数据源的Spring事务管理
  7. shell 进入hadoop_Hadoop关于HDFS的基本操作(Shell命令)
  8. 标题在图表上_图与表,让你的图表更简单清晰易读,告诉你怎么设置图表
  9. go get如何删除_Go语言HTTP请求(req库)
  10. iOS上传应用到AppStore出现Authenticating with the iTunes store
  11. Mysql解压版配置环境等
  12. ~~~~练习~~~~用户登录(三次机会重试)
  13. 利用dialogArguments进行网页页面传值
  14. 数学建模之回归分析加例题详解(MATLAB实现)
  15. MMORPG端游《ELYON》12月10日上线 采用买断式收费方式
  16. oracle remap schema,impdp的remap_schema选项的另一个schema是否要重建
  17. python sklearn svm_文本分类和预测 sklearn.svm.LinearSVC(1)
  18. QQ 简洁模式切换失败解决方法
  19. Galera Cluster 实现mysql群集
  20. birthday中文是什么_birthday中文怎么读

热门文章

  1. creo配置文件config选项详解_5年资深架构师重点聚焦:SpringBoot的配置详解+内嵌Servlet容器
  2. SQL 查找是否存在,别再 count 了,很耗费时间的!
  3. 春节!免费送出一个佳能相机!
  4. 天鼎:一个技术人在世界读书日的遐想
  5. 设置Java JDK的默认编码为UTF-8
  6. Activiti 学习记录1 inclusiveGateway与 exclusiveGateway的区别
  7. CDP客户数据管理平台体系化搭建
  8. 算法工程师面试题【集锦cv/ml/dl】
  9. 倒排索引、分词、同义词
  10. 【跃迁之路】【706天】程序员高效学习方法论探索系列(实验阶段463-2019.1.26-27)...