python解决汉诺塔问题

简介: python解决汉诺塔问题

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

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

这里,我们把三根柱子分别命名为A、B、C。


其中A为起始柱,B为过度柱,C为结果柱( ABC只是命名不同,不需要一模一样。)


解决思路如下:


采用递归方法,要想解决n个圆盘的转移,先解决n-1个圆盘......


直到圆盘只剩下一个,即一定会有一步,使n-1个盘子移动到过度柱B,才能让最大的第n个盘子移动到C。


这时可以忽略第n个盘子了,使问题变成移动n-1(或者说是第n-1和n-2个)个盘子,从B经过A(新的过度柱)移动到C。


假如只有一个盘子:


A->C


假如有两个盘子:


A->B


A->C


B->C


假如有三个盘子:


A->C


A->B


C->B


A->C  #此时最大的盘子已经移动到C   接下来剩下的要从B经过A(新的过度柱)移动到C。


B->A


B->C


A->C


话不多说,代码如下:

def hanoi(num, a, b, c): #从A经过B移动到C即要解决问题的整体思路
    if num > 0:
        hanoi(num - 1, a, c, b) #从A经过C移动到B 步骤1
        print("moving from %s to %s " % (a, c))
        hanoi(num - 1, b, a, c) #从B经过A移动到C 步骤2
hanoi(3, 'A', 'B', 'C')

思路比较简单,内部代码运行可能比较麻烦,感兴趣如下:

注意,函数并非一直向下执行,而是多次重复步骤1,直到n-1个盘子都从A经过C移动到B,

以上为例,当有3个盘子时:

进入函数 hanoi(3, A, B, C)

  • 执行函数层1步骤1
  • hanoi(2, A, C, B)  #先将n-1个移动到B(由函数层1,进入函数层2)

(此时对于第二层 步骤1  hanoi(1, A, B, C),对于步骤2  hanoi(1, C, A, B)

  • 执行函数层2步骤1

hanoi(1, A, B, C)   #先将n-1个的上面的移动到C 以此类推(进入函数层3)


(此时对于函数层3 步骤1  hanoi(0, A, C, B),对于步骤2  hanoi(0, B, A, C))


当A上剩余最后一个,此时继续执行步骤1,再进入一层函数


                               执行函数层3步骤1

hanoi(0, A, C, B)  #(进入函数层4)


由于if条件不成立,函数结束,返回上一层函数hanoi(0, A, B, C)的末尾,函数层3的步骤1结束,开始执行print函数,函数层3的%(a,c)参数受函数层2的影响


moving from A to C   #打印转移的第一步,把第一个移动到了C


                               执行函数层3的步骤2

hanoi(0, A, C, B)  #(进入函数层4)


由于if条件不成立,函数结束,返回上一层函数hanoi(0, A, B, C)的末尾,函数层3的步骤2结束,返回函数层2步骤一末尾,开始执行print函数,函数层2的%(a,c)参数受函数层1的影响


moving from A to B


               执行函数层2步骤2

hanoi(1, C, A, B)  方法与函数层2步骤1相同


执行函数层3步骤1 ,结束


print:moving from C to B


执行函数层3步骤2,结束


函数层2步骤2结束


执行函数层1步骤12之间的print函数 (受hanoi(3, A, B, C)影响 )


moving from A to C   (完成第n个的转移)


执行函数层1步骤2(同上)

hanoi(2, B, A, C)   ( 步骤1hanoi(1, B, C, A)  步骤2hanoi(1, A, B, C) ,不再细写)


moving from B to A


moving from B to C


moving from A to C


结束


moving from A to C


moving from A to B


moving from C to B


moving from A to C


moving from B to A


moving from B to C


moving from A to C


来道例题加深理解:

96447814-120fc980-1245-11eb-938d-6ea408716c72.png

class Solution(object):
    def hanota(self, A, B, C):
        n = len(A)
        self.move(n, A, B, C)
    def move(self, n, A, B, C):
        if n == 1:
            C.append(A.pop())
        else:
            self.move(n - 1, A, C, B)
            C.append(A.pop())
            self.move(n - 1, B, A, C)
A = [2, 1, 0]
B = []
C = []
Solution().hanota(A, B, C)
print(C) # [2, 1, 0]
相关文章
|
6月前
|
算法 Python
Python 一步一步教你用pyglet制作汉诺塔游戏
Python 一步一步教你用pyglet制作汉诺塔游戏
118 0
|
6月前
|
算法 数据处理 Python
【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.
【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.
34 0
|
Python
蓝桥杯-汉诺塔问题-python解法
蓝桥杯-汉诺塔问题-python解法
190 0
|
Python
Python|如何用递归解决汉诺塔问题?
Python|如何用递归解决汉诺塔问题?
121 0
|
算法 Python
python递归——汉诺塔
汉诺塔的传说 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。
1227 0
|
Python
<递归>汉诺塔 | 斐波那契数列 | 阶乘 (附python实现源码)
经典递归 汉诺塔问题 背景故事 传说印度某间寺院有三根柱子,上串64个金盘。寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子;预言说当这些盘子移动完毕,世界就会灭亡。
1329 0
|
算法 Python
【Python学习】Python解决汉诺塔问题
参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好;写代码也不是必然,省事最好;拿也好,查也好,解决问题就好! 信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会,或许其中的某一个细节就能够用于各个问题的解决,共勉 学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了  汉诺塔的图解递归算法 一.起源:   汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。
3272 0
|
Python
汉诺塔 python版
 汉诺塔问题:如果将n个盘子(由小到大)从a通过b,搬到c,搬运过程中不能出现小盘子在大盘子下面的情况。  思路分析:假设前要移动第100个盘子,分两步走,移动第99个;再移动第100个;而要移动第99个,同样分两部,移动第98个,再移动第99个,以此类推;   if(n>1)   {   ...
952 0
|
6天前
|
机器学习/深度学习 人工智能 TensorFlow
人工智能浪潮下的自我修养:从Python编程入门到深度学习实践
【10月更文挑战第39天】本文旨在为初学者提供一条清晰的道路,从Python基础语法的掌握到深度学习领域的探索。我们将通过简明扼要的语言和实际代码示例,引导读者逐步构建起对人工智能技术的理解和应用能力。文章不仅涵盖Python编程的基础,还将深入探讨深度学习的核心概念、工具和实战技巧,帮助读者在AI的浪潮中找到自己的位置。
|
6天前
|
机器学习/深度学习 数据挖掘 Python
Python编程入门——从零开始构建你的第一个程序
【10月更文挑战第39天】本文将带你走进Python的世界,通过简单易懂的语言和实际的代码示例,让你快速掌握Python的基础语法。无论你是编程新手还是想学习新语言的老手,这篇文章都能为你提供有价值的信息。我们将从变量、数据类型、控制结构等基本概念入手,逐步过渡到函数、模块等高级特性,最后通过一个综合示例来巩固所学知识。让我们一起开启Python编程之旅吧!