汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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. flask异常处理

    对于异常,通常可以分为两类:一类是可以预知的异常,我们通常会用try...except....捕捉,第二类是未知的error,我们是无法预知的. try: code block except A: e ...

  2. Dockerfile centos7_php5.6.36

    Dockerfile: FROM centos:7 MAINTAINER www.ctnrs.com RUN yum install epel-release -y && \ yum ...

  3. 十二、存token获取token刷新token发送header头

    //测试token //获取token function setToken(data){ var storage = window.localStorage; if(!storage){ alert( ...

  4. python-Selenium库的详解

    一.什么是Selenium selenium 是一套完整的web应用程序测试系统,包含了测试的录制(selenium IDE),编写及运行(Selenium Remote Control)和测试的并行 ...

  5. Stochastic Optimization of PCA with Capped MSG

    目录 Problem Matrix Stochastic Gradient 算法(MSG) 步骤二(单次迭代) 单步SVD \(project()\)算法 \(rounding()\) 从这里回溯到此 ...

  6. 使用git将本地项目推送到码云私有仓库

    https://blog.csdn.net/qq_33876553/article/details/80111946 2018年04月27日 19:53:33 桥路丶 阅读数:2958 前言 之前博主 ...

  7. 多线程系列之五:Balking 模式

    一,什么是Balking模式 如果现在不合适执行这个操作,或者没必要执行这个操作,就停止处理,直接返回.在Balking模式中,如果守护条件不成立,就立即中断处理. 二,例子: 定期将当前数据内容写入 ...

  8. Pyspider上手

    pyspider安装: pip3 install Pyspider 启动服务操作 1.打开cmd:输入        pyspider  --help 回车,可以查看帮助信息,pyspider all ...

  9. C#设计模式之8:外观模式

    外观模式 外观模式和适配器模式一样,都实现了接口改变,适配器模式是让一个接口转化成另外一个接口,而外观模式是让接口变得更简单. 先来看一下需求: 外观模式没有封装子系统的类,外观只是提供一个统一的接口 ...

  10. 4 Past progressive VS simple past

    1 一般过去时用来谈论过去开始和结束的活动.过去进行时用来谈论过去正在进行或者发生的活动. Why were you at office so later yesterday? I was worki ...