上一节简单的讲述了递归的实现与简单应用,接下来我们说一下另一个经典应用。

汉诺塔递归解法

一.起源:

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

二.抽象为数学问题:

如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数。

实现这个算法可以简单分为三个步骤:

1.把n-1个盘子由A 移到 B;

2.把第n个盘子由 A移到 C;

3.把n-1个盘子由B 移到 C;

从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:

1.中间的一步是把最大的一个盘子由A移到C上去;

2.中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,

3.中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;

通过以上的算法模型可以编写如下函数:

void hanoi(int n, char a, char b, char c)
{static int cnt = 0;if( n > 0 ){if( n == 1 )printf("%d times ==> %c -> %c\n", ++cnt,a, c);else{hanoi(n-1, a, c, b);            printf("%d times ==> %c -> %c\n", ++cnt,a, c);            hanoi(n-1, b, a, c);}}
}

如何理解汉诺塔的递归?(比较经典)
C语言实现代码下载地址:

数据结构之栈与递归的应用(汉诺塔递归解法)相关推荐

  1. java汉诺塔递归算法_数据结构--汉诺塔递归Java实现

    1 /*汉诺塔递归2 * 1.将编号0-N-1个圆盘,从A塔座移动到B上面3 * 2.将编号N的1个圆盘,从A移动到C上面4 * 3.最后将B上面的N-1个圆盘移动到C上面5 * 注意:盘子的编号从上 ...

  2. 汉诺塔递归的c语言实现(递归)

    对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了,   每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h>void move(i ...

  3. 汉诺塔递归与非递归实现

    汉诺塔递归与非递归实现 背景介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64 ...

  4. 汉诺塔递归Python实现

    大二学习数据结构的时候知道了汉诺塔问题,由于当时不求甚解对这个问题没真正理解.今天学习廖雪峰python教程遇到了递归实现汉诺塔的练习,这才终于真正理解了汉诺塔递归的问题. 汉诺塔问题:有三个柱子A, ...

  5. C语言递归思想实现汉诺塔

    目录 1.递归思想简介 2.汉诺塔问题 3.汉诺塔递归的c语言实现 1.递归思想简介 在c语言中,程序调用自身的编程技巧称为递归( recursion). 递归的定义看上去似乎很抽象,使用代码描述能够 ...

  6. 青蛙跳台(含变种)及汉诺塔递归,母牛生小牛

    青蛙跳台(含变种)及汉诺塔递归,母牛生小牛 文章目录 青蛙跳台(含变种)及汉诺塔递归,母牛生小牛 #define _CRT_SECURE_NO_WARNINGS #include<Windows ...

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

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

  8. 算法分析:傻瓜式理解汉诺塔递归问题

    算法分析:傻瓜式理解汉诺塔递归问题 一.汉诺塔问题规则 设a.b.c是三个塔座, 开始时,a上有n个圆盘自下而上,从大到小地叠放在一起. 现要求将a上的圆盘移到b上,仍按相同顺序叠放 规则1:每次只能 ...

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

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

最新文章

  1. spring cloud 断路器仪表盘详解
  2. Hive 0.13 数据类型
  3. ubuntu 电源按钮操作_Ubuntu电脑操作基础:桌面背景,屏保和电源
  4. 如何使用ABAP把数字转换成单词
  5. 软硬件协同编程 - C#玩转CPU高速缓存(附示例)
  6. 在编写异步方法时,使用 ConfigureAwait(false) 避免使用者死锁
  7. 1044. 火星数字(20)
  8. Docker自动补全容器名
  9. MobileNet(v1、v2)——CNN经典网络模型详解(pytorch实现)
  10. 聪明贝塔(Smart Beta)
  11. 百度AI之身份证识别
  12. 多实例学习PCNN在关系抽取中的应用
  13. 【电脑讲解】压缩包的使用技巧
  14. 在服务器上如何打开mdf文件,在没sql server数据库状况下怎么打开.mdf文件
  15. 最新版苹果手机html5摇一摇,iphone微信摇一摇失效问题解决
  16. Android Compose——一个简单的Bilibili APP
  17. formality 命令/变量的使用及各种设置
  18. 免费天气接口php,360免费天气Api接口(附使用示例)
  19. 数据可视化第4篇:安装linux操作系统6系列
  20. C#EXCEL操作大全

热门文章

  1. 微信小程序uni.getImageInfo踩坑大计划
  2. oracle ogg 12安装,Oracle GoldenGate Studio 12.2.1.3安装
  3. 时间序列趋势判断(三)——Mann-Kendall趋势检验
  4. 关联分析算法(一)——Apriori(先验算法)
  5. 部署可道云_可道云-快速搭建个人用云网盘
  6. vm linux数据恢复,VMWARE虚拟机数据恢复
  7. mysql里面的页面筛选_【mysql】像很多网站(比如电商)里的筛选功能一般是如何实现的?...
  8. c语言指针填空题目,C语言指针题目实战
  9. 调用微信支付接口总结
  10. loadrunner录制回放常见问题及解决办法