用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)
汉诺塔问题源于印度的一个古老传说:梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着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)的更多相关文章
- 汉诺塔问题(Hanoi Tower)递归算法解析(Python实现)
汉诺塔问题 1.问题来源:汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着64片黄金圆盘.上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根 ...
- 编程:递归编程解决汉诺塔问题(用java实现)
Answer: //Li Cuiyun,October 14,2016. //用递归方法编程解决汉诺塔问题 package tutorial_3_5; import java.util.*; publ ...
- 【学习】Python解决汉诺塔问题
参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好:写代码也不是必然,省事最好:拿也好,查也好,解决问题就好! ...
- 关于C语言解决汉诺塔(hanoi)问题
C语言解决汉诺塔问题 汉诺塔是典型的递归调用问题: hanoi简介:印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔.不论白天黑夜,总有一个僧侣 ...
- java 中递归的实现 以及利用递归方法实现汉诺塔
今天说下java语言中比较常见的一种方法,递归方法. 递归的定义 简单来说递归的方法就是"自己调用自己",通过递归方法往往可以将一个大问题简单化,最终压缩到一个易于处理的程度.对于 ...
- C语言:使用递归解决汉诺塔问题。
//汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小 ...
- C#递归解决汉诺塔问题(Hanoi)
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExamp ...
- java 解决汉诺塔问题
//汉诺塔问题//HanYang 2016/10/15 import java.util.Scanner; //输出public class Hanuota { public static void ...
- python解决汉诺塔问题
今天刚刚在博客园安家,不知道写点什么,前两天刚刚学习完python 所以就用python写了一下汉诺塔算法,感觉还行拿出来分享一下 首先看一下描述: from :http://baike.baidu. ...
随机推荐
- python中各个response使用
Python django中我们经常用的response有django中的 JsonResponse, HttpResponse,还有DRF中的Response 在使用的时候,经常会不知道如何什么时候 ...
- functools下的partial模块应用
问题 你有一个被其他python代码使用的callable对象,可能是一个回调函数或者是一个处理器, 但是它的参数太多了,导致调用时出错. 解决方案 如果需要减少某个函数的参数个数,你可以使用 fun ...
- Java 自动装箱与拆箱(Autoboxing and unboxing)
什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自J2SE 5.0开始提供的功能. 一般我们要创建一个类的对象实例的时候,我们会这样: Class a = ...
- javascript与php与python的函数写法区别与联系
1.javascript函数写法种类: (一).第一种 function test(param){ return 111; } (二).第二种 var test = function(param){ ...
- JavaScript修改DOM节点时,样式优先级的问题
通过element.style.xxx设置或者读取的xxx样式属性,都是属于行间样式(<p style="color=red"></p>),并不是 使用li ...
- E: 无法打开锁文件 /var/lib/dpkg/lock-frontend - open (13: 权限不够)E: 无法获取 dpkg 前端锁 (/var/lib/dpkg/lock-frontend),请查看您是否正以 root 用户运行?
一.解决方案 修改root密码,以root身份安装 sudo pwdroot root # 输入新密码即可
- centos安装bundle文件
centos安装VMware-Workstation-Full-*.bundle那点事 | 鳗鱼是条狗https://kinggoo.com/centos-vmware.htm Linux 下 VMW ...
- 如何在 Linux 中查找最大的 10 个文件
https://linux.cn/article-9495-1.html
- Linux下设置MySql自动启动
https://www.cnblogs.com/sunny3096/p/7954146.html
- Linux (Redhat / Fedora / CentOS) 更改 hostname 的方式
Linux (Redhat / Fedora / CentOS) 更改 hostname 的方式 [蔡宗融個人網站]https://www.ichiayi.com/wiki/tech/linux_ho ...