hello,你好呀,我是灰小猿,一个超会写bug的程序猿,

今天和大家分享一个递归经典算法案例---“汉诺塔”。

汉诺塔问题回顾

汉诺塔(Tower of Hanoi)源于印度传说中,大梵天创造世界时造了三根金钢石柱子,其中一根柱子自底向上叠着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

这是一个著名的问题,几乎所有的教材上都有对这个问题的介绍。由于条件是:

借助一个中转柱,使起始柱中按照规则排放的盘子移动到终点柱,且一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:18,446,744,073,709,551,615

这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。

在平常的编程练习过程中,汉诺塔问题也是一个十分常见的算法案例。今天我就和小伙伴们具体分析一下汉诺塔问题的解决方案。

首先我们来看一个三层汉诺塔的图解,来对汉诺塔问题的解决有一个简单的了解:

如上图所示,我们可以看出,当盘子的数量只有一个的时候,我们可以直接将盘子移动到目标盘,在进行三层汉诺塔问题的解决时。我们先将最上方的两个盘子借助目标盘移动至中转盘,再将最大的盘子移动至目标盘,之后再将中转盘上的第一个盘子移动至起始盘,这个时候我们就可以将二号盘移动至目标盘,最后将起始盘上的一号盘移动至目标盘。

由此我们可以总结出n层汉诺塔的解决方案:

将前n-1个盘子借助当前的中转盘(不一定是B托盘)移动至相邻的空托盘上,再将第n个盘子移动至目标盘,之后重复上述步骤直至将所有的盘子都移动至目标盘。在这个也用到了函数方法的递归思想。

接下来分别使用java和Python向大家演示一下n阶汉诺塔的求解方法:

Java求解汉诺塔

package 汉诺塔算法;public class Hanoi {public static void main(String[] args) {// TODO Auto-generated method stubHanoi h = new Hanoi();char a = 'A';char b = 'B';char c = 'C';int count = h.hanoi(3, a, b, c);System.out.println(count);}/*** 汉诺塔问题* @param n 阶数* @param a 起始柱* @param b 中转柱* @param c 目标柱* @return 移动次数* */public int hanoi(int n,char a,char b,char c) {if (n == 1) {move(a, c);} else {hanoi(n-1, a, c, b);move(a, c);hanoi(n-1, b, a, c);}//汉诺塔的移动次数为(2**n)-1return (int) Math.pow(2, n)-1;}public void move(char a,char b) {System.out.println(a + "--->" + "b");}
}

Python求解汉诺塔

i = 1   # 定义全局变量记录次数
def move(n, a, c):global iprint("第{}步:将编号为{}的盘子从{}--->{}".format(i, n, a, c))i += 1
def hanoi(n,a,b,c):#a,b,c分别是三根柱子,n为套在a柱上的圆圈个数if n == 1:move(n, a, c)else:hanoi(n-1, a, c, b)move(n, a, c)hanoi(n-1, b, a, c)
if __name__ == '__main__':n = int(input("请输入盘子数量:"))hanoi(n, "A", "B", "C")

好了,关于汉诺塔问题的讲解就和小伙伴们分享到这里,有不足的地方还希望大家提出指正,大灰狼陪你一起进步!

手撕“汉诺塔算法”之详细图解相关推荐

  1. 【汉诺塔-算法必备】

    文章目录 汉诺塔~算法 代码如下: 一天一点python小学习 `小知识点`: 上一页:[PTA~基础编程题集](https://blog.csdn.net/m0_66318554/article/d ...

  2. 汉诺塔算法python_python实现汉诺塔算法

    题目: 汉诺塔给出最优解,如果对汉诺塔的定义有不了解,请翻看数据结构教材. 除了最基本的之外,还有一题,给定一个数组,arr=[2,3,1,2,3],其含义是这是一个有5个圆盘的汉诺塔,每一个数字代表 ...

  3. 算法自我分析——汉诺塔算法

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

  4. python汉诺塔算法解析_基于Python的汉诺塔算法

    首先贴出Python编写的汉诺塔算法的代码: def hanoti(n,x1,x2,x3): if(n == 1): print('move:',x1,'-->',x3) return hano ...

  5. python汉诺塔算法解析,python实现的汉诺塔算法示例

    本文实例讲述了python实现的汉诺塔算法.分享给大家供大家参考,具体如下: 规则: 圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定 在小圆盘上不能放大圆盘 在三根柱子之间一次只能移动一个圆 ...

  6. python实现汉诺塔递归经典算法_Python递归实现汉诺塔算法示例

    本文实例讲述了Python递归实现汉诺塔算法.分享给大家供大家参考,具体如下: 最近面试题,面试官让我5分钟实现汉诺塔算法(已然忘记汉诺塔是啥). 痛定思痛,回来查了一下汉诺塔的题目和算法.题干与实现 ...

  7. 汉诺塔算法 java_汉诺塔算法java实现详解

    import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public ...

  8. 汉诺塔算法 java_java实现汉诺塔算法

    package com.ywx.count; import java.util.Scanner; /** * @author Vashon * date:20150410 * * 题目:汉诺塔算法(本 ...

  9. C++实现汉诺塔算法

    C++实现汉诺塔算法案例 汉诺塔的规则: 注:图片素材–>路飞学城 算法过程原理: 根据上图,利用递归实现汉诺塔算法. 算法实现: #define _CRT_SECURE_NO_WARNINGS ...

最新文章

  1. 晶创6电梯卡的数据结构_修改电梯卡发现“商机”,男子涉嫌盗窃罪!
  2. [视频教程] 使用composer安装使用thinkphp6.0框架
  3. RabbitMQ系列教程之一:我们从最简单的事情开始!Hello World
  4. 防止缓存爆炸的快速提示
  5. Chrome英文版离线安装包下载
  6. 关于安卓开发的一些你必须要掌握的网络知识(一):网络基础与网络框架OkHttp
  7. Altium Designer 16
  8. 代码埋点、可视化埋点、无埋点几种数据埋点方案的分析报告
  9. 逻辑思维题及答案解析
  10. Arcgis js api 点聚合
  11. linux下监测cpu温度,linux下CPU温度监测
  12. python画好看的图案-妈耶,python的散点图竟然能画这么好看!
  13. stm32---RS485半双工通信
  14. [转] CodeMirror基本配置项
  15. 搭建私有云maven文档(超详细)超级容易上手
  16. 活化酯类和马来酰亚胺双功能偶联剂-瑞禧小编ADC抗体偶联
  17. 爬虫开发02--数据解析--xpath(首选)
  18. Unity旋转之四元数(开关车门,第一人称控制器)
  19. 计算机柜里 do dl代表什么,dl是什么意思(你知道AI、ML和DL分别代表什么吗?)...
  20. 饥荒云服务器t键,饥荒T键使用说明 | 手游网游页游攻略大全

热门文章

  1. [android] 手机卫士黑名单功能(ListView优化)
  2. C# 使用JObject解析嵌套json
  3. 美私企向空间站成功发射飞船
  4. DSP6678串口(UART)使用学习
  5. php 使用$_GET获取信息为空时,报错解决方法
  6. 2018中国金融科技竞争力100强榜单
  7. R语言——swirl包学习ggplot2 (一)
  8. google app engine 错误解决记录
  9. canvas画图不显示问题
  10. extern变量c语言,C语言外部变量extern