汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。梵天命令婆罗门把圆盘按大小顺序重新摆放在另一根柱子上,并且规定小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。当所有的黄金圆盘都重新摆放在另一根柱子上时,世界就将在霹雳声中毁灭,梵塔、庙宇和众生都将同归于尽。

假设A是起始柱,B是中间柱,C是目标柱。

从最简单的例子开始看:

  • 如果A柱上只剩一个圆盘,那么将圆盘从A柱移到C柱即可。 (A --> C)
  • 如果A柱上剩两个圆盘,那么先将小圆盘从A柱移到B柱,再将大圆盘从A柱移到C柱,最后将B柱上的小圆盘移到C柱。(A --> B, A --> C, B --> C)
  • 如果A柱上剩三个圆盘,那么先将最小的圆盘从A柱移到C柱,再将中间大小的圆盘从A柱移到B柱,然后将C柱上的最小的圆盘移到B柱,然后将A柱上的最大的圆盘移到C柱,然后将B柱上的最小的圆盘移到A柱,继续将B柱上的中间大小的圆盘移到C柱,最后将A柱上的最小的圆盘移到C柱。 (A -->C, A -->B, C --> B, A --> C, B --> A, B --> C, A --> C) --- 前三步(A -->C, A -->B, C --> B)可以看成是A --> B的过程,中间是A --> C的过程,最后三步(B --> A, B --> C, A --> C)可以看成是B --> C的过程

综上所述,如果需要移动n个圆盘,那么整个过程可以抽象成以下三个步骤:

1. 将除底盘以外的圆盘(n-1个圆盘)从A柱移动到B柱

2. 将底盘从A柱移动到C柱

3. 将B柱上的圆盘(n-1个圆盘)移动到C柱

从最复杂的例子开始看:

  • 如果A柱上有64个圆盘,最简单的做法是把A柱上的64个圆盘想象成一共是2个圆盘(底盘是一个圆盘,底盘上面的63个圆盘是一个圆盘),这样的话,只需先将A柱上的63个圆盘移动到B柱,再将底盘从A柱移到C柱,最后将B柱上的63个圆盘移到C柱。
  • 如果A柱上有63个圆盘,则把A柱上的63个圆盘想象成一共是2个圆盘(底盘是一个圆盘,底盘上面的62个圆盘是一个圆盘),这样的话,只需先将A柱上的62个圆盘移动到B柱,再将底盘从A柱移到C柱,最后将B柱上的62个圆盘移到C柱。
  • 以此类推,直到A柱上只剩一个圆盘,然后将该圆盘从A柱移到C柱即可。

综上可以看出,通过不断重复嵌套,这个问题可以用递归方法解决。

代码如下:
def hanoi(n,a,b,c):   # n表示需要移动几个圆盘,a代表起始柱,b代表中间柱,c代表目标柱
if n==1: # 如果只剩1个圆盘,那么将圆盘从a柱移动到c柱即可
print(a,"->",c)
else: # 当n > 1时,用抽象出的3步来移动
hanoi(n-1,a,c,b) # 将n-1个圆盘从a移动到b
hanoi(1,a,b,c) # 将底盘从a移动到c
hanoi(n-1,b,a,c) # 将b上的n-1个圆盘移动到c

试一下移动3个圆盘的步骤是否和前文一致:

hanoi(3,"A","B","C")

运行结果如下:

A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C

可以看出,移动3个圆盘需要7步。根据推算,移动n个圆盘需要2n-1步。假设每次移动一个圆盘都是1秒钟的时间,婆罗门不停地在移动圆盘,那么总共需要(264-1)秒的时间,世界就会毁灭。按一年365天计,需要584,942,417,355.072年世界才会毁灭。

用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)的更多相关文章

  1. 汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)

    汉诺塔问题 1.问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根 ...

  2. 编程:递归编程解决汉诺塔问题(用java实现)

    Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...

  3. 【学习】Python解决汉诺塔问题

    参考文章:http://www.cnblogs.com/dmego/p/5965835.html   一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好!   ...

  4. 关于C语言解决汉诺塔(hanoi)问题

    C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...

  5. java 中递归的实现 以及利用递归方法实现汉诺塔

    今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...

  6. C语言:使用递归解决汉诺塔问题。

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

  7. C#递归解决汉诺塔问题(Hanoi)

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExamp ...

  8. java 解决汉诺塔问题

    //汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...

  9. python解决汉诺塔问题

    今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...

随机推荐

  1. 小P的金字塔

    题目描述 小P感到自己前几天太作了,于是非常有远见的决定为自己建立一座金字塔. 现在他有n种标准长方体的石头,每种石头只有两个,第i种石头是长宽高分别为Xi,Yi,Zi的长方体.由于整个工程只有小P一 ...

  2. OSS网页上传和断点续传(OSS配置篇)

    OSS网页上传和断点续传主要根据BrowserJS-SDK和相关文档整理而得,快速构建OSS上传应用 一.Bucket设置 浏览器中直接访问OSS需要开通Bucket的CORS设置 将allowed ...

  3. JAVAString初始化的引用问题

    1 String a="Hello JAVA"; 2 3 String b=a; 4 5 System.out.println(a); 6 7 System.out.println ...

  4. Linux 下面 Sqlserver 2017 的简单安装

    1. 公司网络太烂 yum 在线安装失败 2. 解决方法 找微软的官网 百度网盘 离线下载rpm包. https://packages.microsoft.com/rhel/7/mssql-serve ...

  5. spring MVC请求处理类注解属性详解

  6. cookie路径概念理解

    .创建一个cookie并设置 cookie的有效路径: $.cookie('the_cookie', 'the_value', { expires: 7, path: '/' }); 注:在默认情况下 ...

  7. Field tTypeMapper in com.atguigu.project.service.imp.projectInfoServiceImpl required a bean of type 'com.atguigu.project.mapper.TTypeMapper' that could not be found.

    解决:MapperScan

  8. Python魔法方法(magic method)细解几个常用魔法方法(下)

    接上文,再介绍最后几个常用的魔法方法. 关于__dict__: 先上个例子: class Test(object): fly = True def __init__(self, age): self. ...

  9. python学习笔记(11)--数据组织的维度

    数据的操作周期 存储  -- 表示 -- 操作 一维数据表示 如果数据有序,可以使用列表[]:如果数据没有顺序,可以使用集合{} 一维数组存储 存储方式一:空格分隔 ,使用一个或多个空格分隔进行分隔, ...

  10. Vue.js文档

    参考网址:https://vuefe.cn/ 第一  安装 1.下载到本地后使用<script>标签直接引入 2.使用CDN引入 例如:使用CDN引入 <script src=&qu ...