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

article/2025/9/17 23:47:43

摘要: 参考文章:http://www.cnblogs.com/dmego/p/5965835.html 一句话:学程序不是目的,理解就好;写代码也不是必然,省事最好;拿也好,查也好,解决问题就好! 信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会,或许其中的某一个细节就能够用于各个问题的解决,共勉 学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了  汉诺塔的图解递归算法 一.起源:   汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

 

参考文章:http://www.cnblogs.com/dmego/p/5965835.html

 

一句话:学程序不是目的,理解就好;写代码也不是必然,省事最好;拿也好,查也好,解决问题就好!

 

信息时代不用信息就是罪过,直接抄不加理解与应用,就不是自己的,下次遇到还是不会1.gif,或许其中的某一个细节就能够用于各个问题的解决,共勉

 

学习一个东西总会遇到一些经典的问题,学习Python第二天尝试看一下汉诺塔问题,还是百度,看看解题思路,纯粹是重温初中课堂,越活越回去了

 

 汉诺塔的图解递归算法

 

一.起源:

 

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

 

二.抽象为数学问题:

 

  如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘子上面,求移动的步骤和移动的次数

![image](https://yqfile.alicdn.com/451bad65007292a4ffb6e348f7da62a807ac9d77.png)

解:(1)n == 1

 

       第1次  1号盘  A---->C       sum = 1 次

 

       (2)  n == 2

 

       第1次  1号盘  A---->B

 

       第2次  2号盘  A---->C

 

       第3次  1号盘  B---->C        sum = 3 次

 

  (3)n == 3

 

  第1次  1号盘  A---->C

 

  第2次  2号盘  A---->B

 

  第3次  1号盘  C---->B

 

  第4次  3号盘  A---->C

 

  第5次  1号盘  B---->A

 

  第6次  2号盘  B---->C

 

  第7次  1号盘  A---->C        sum = 7 次

三.调用方法的栈机制:(特点:先进后出)

 

       从主线程开始调用方法(函数)进行不停的压栈和出栈操作,函数的调用就是将函数压如栈中,函数的结束就是函数出栈的过程,这样就保证了方法调用的顺序流,即当函数出现多层嵌套时,需要从外到内一层层把函数压入栈中,最后栈顶的函数先执行结束(最内层的函数先执行结束)后出栈,再倒数第二层的函数执行结束出栈,到最后,第一个进栈的函数调用结束后从栈中弹出回到主线程,并且结束。

 

四.算法分析(递归算法):

 

       我们在利用计算机求汉诺塔问题时,必不可少的一步是对整个实现求解进行算法分析。到目前为止,求解汉诺塔问题最简单的算法还是同过递归来求,至于是什么是递归,递归实现的机制是什么,我们说的简单点就是自己是一个方法或者说是函数,但是在自己这个函数里有调用自己这个函数的语句,而这个调用怎么才能调用结束呢?,这里还必须有一个结束点,或者具体的说是在调用到某一次后函数能返回一个确定的值,接着倒数第二个就能返回一个确定的值,一直到第一次调用的这个函数能返回一个确定的值。

 

       实现这个算法可以简单分为三个步骤:

 

    (1)     把n-1个盘子由A 移到 B;

 

    (2)     把第n个盘子由 A移到 C;

 

    (3)     把n-1个盘子由B 移到 C;

 

从这里入手,在加上上面数学问题解法的分析,我们不难发现,移到的步数必定为奇数步:

 

    (1)中间的一步是把最大的一个盘子由A移到C上去;

 

    (2)中间一步之上可以看成把A上n-1个盘子通过借助辅助塔(C塔)移到了B上,

 

    (3)中间一步之下可以看成把B上n-1个盘子通过借助辅助塔(A塔)移到了C上;

 

四、Python实现

 

网上很多资料,只要理解就好,然后拿来自己用,遇到类似的递归问题,再举一反三

先看看JAVA实现,大学的时候看了几本JAVA的书,后来没怎么用过,也就忘了

 

public static void hanoi(int n,char A,char B,char C){if(n == 1)//圆盘只有一个时,只需将其从A塔移到C塔TowersOfHanoi.move(1, A, C);//将编b号为1的圆盘从A移到Celse{//否则hanoi(n - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔TowersOfHanoi.move(n, A, C);//把A塔上编号为n的圆盘移到C上hanoi(n - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔}}



定义一个汉诺塔函数

def hanoi(n, A, B, C):if n==1:print(A+'->'+C)else:hanoi(n-1, A, C, B)print(A+'->'+C)hanoi(n-1, B, A, C)hanoi(3, 'A', 'B', 'C')

函数作为参数直接调用

转载于:https://my.oschina.net/u/3472227/blog/912399


http://chatgpt.dhexx.cn/article/5akIeWOI.shtml

相关文章

C++ 汉诺塔程序实现

2019独角兽企业重金招聘Python工程师标准>>> 首先不看代码,汉诺塔解题步骤有三步(设A->C),先将汉诺塔看成两部分n-1,1(n-1在上面) 第一:将A中的n-1个盘借助C移到B >Hanoi(n-1,a,c,b); 第二&#xff…

【算法与数据结构】汉诺塔

数据结构里的汉诺塔,递归的典型代表,几乎讲到递归都会讲到汉诺塔,今天才把汉诺塔看明白,惭愧啊。 不废话了,贴代码,基本思想在注释里有,话说往CNBLOG首页投了两次,两次都被小编给扯下…

递归-汉诺塔

2019独角兽企业重金招聘Python工程师标准>>> 递归(recursion):程序调用自身的编程技巧。 反复执行的过程(调用自身)有跳出反复执行过程的条件(递归出口) import com.lifeibigdata.al…

汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 前提说明: ‍算法:当只有一个盘子的时候,只需要从将A塔上的一个盘子移到C塔上。 当A塔上有两个盘子是,先将A塔上的1号盘子(编号从上到下)移动到B塔上…

JavaScript算法实现之汉诺塔(Hanoi)

目前前端新手,看到的不喜勿喷,还望大神指教。 随着Node.js,Angular.js,JQuery的流行,点燃了我学习JavaScript的热情!以后打算每天早上跟晚上抽2小时左右时间将经典的算法都用JS来实现,加快学习JS的步伐&…

【C语言】递归的经典问题(模拟strlen,阶乘,斐波那契数列,汉诺塔,青蛙跳台阶)

以下我分享的是关于C语言递归的比较经典的题,有些题提供了多种解法,希望可以帮助你打开思路,如果你有更多的解法,欢迎评论区留言哟~ 目录 一、输入1234,输出1 2 3 4 二、模拟strlen功能 1)递归 2&…

7.递归-汉诺塔

汉诺塔问题: 如果求解的汉诺塔是3层,可以先将上面的两层看作是一个整体。先将两层经过c作为中介移动到b,再将第三个圆盘直接移动到c。然后再将b上面的两个圆盘移动到c,通过a为中介。 算法分析(递归算法) 我…

数据结构与算法之汉诺塔问题

2019独角兽企业重金招聘Python工程师标准>>> 一、汉诺塔问题 1.汉诺塔问题 起源:一位法国数学家曾编写过一个印度的古老传说:在世界中心贝拿勒斯的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候&#xff…

汉诺塔 最优算法设计商量

2019独角兽企业重金招聘Python工程师标准>>> 引言 汉诺塔算法一向是算法设计科目标最具代表性的研究题目,本文存眷于如何设计多柱汉诺塔最优算法的商量。最简单的汉诺塔是三个柱子(A、B、C),是以多柱汉诺塔的柱子个数M…

函数递归与汉诺塔

C初阶之函数递归 函数递归基本原理 什么是递归?程序调用自身的编程技巧称为递归recursion。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,…

分治算法的解和幂乘算法及其优化以及汉诺塔算法的介绍

分治算法就是分成若干个和原问题一样性质的子问题,然后逐步递归这些子问题,直到遇到规模很小的子问题,求出子问题的解,归结成原问题的解的算法就是分治算法 分治算法为递归问题,可以用来解决快排、二分归并、斐波那契数…

递归求解汉诺塔问题(详细解答)

汉诺塔移动步数的计算 具体汉诺塔的规则大家自行百度吧,就不介绍了,这里介绍一下如何求解汉诺塔移动步数的计算思想。 当汉诺塔层数为一层时,很显然只需要一步,直接从A杆移动到C杆 当层数为两层时,则需要三步&#x…

汉诺塔算法

2019独角兽企业重金招聘Python工程师标准>>> 有A、B和C 3跟柱子,在A上从下往上按照从小到大的顺序放着64个圆盘,以B为中介,把盘子全部移动到C上。移动过程中,要求任意盘子的下面要么没有盘子,要么只能有比它…

汉诺塔算法的理解

2019独角兽企业重金招聘Python工程师标准>>> 当盘子数为两个时,移动图如下: 移动规律为: 步骤盘子编号源柱子目标柱子11AB22AC31BC 当盘子数为3个时: 移动规律为: 步骤盘子编号源柱子目标柱子11AC22AB31CB4…

汉诺塔递归算法

2019独角兽企业重金招聘Python工程师标准>>> import java.util.Scanner;/*** 汉诺塔* * author JayChang* */ public class HanoiResolve {/*** 移动位置* * param positionA* param positionB*/public static void move(String positionA, String positionB) {Syst…

数据结构——树和二叉树 6-1 求二叉树高度 (20 分)

本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

PTA 函数题 求二叉树高度(C语言)

本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Right; }; 要求函数返回给定…

6-1 求二叉树高度

6-1 求二叉树高度 (15 分) 本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT );其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ElementType Data;BinTree Left;BinTree Rig…

二叉树的构造及求解二叉树高度

题目描述 1、参考题目解释构造一棵二叉树&#xff1b; 2、求解二叉树的高度 3、有余力同学尝试打印这棵二叉树&#xff08;以树的形态&#xff0c;非必须&#xff09; 输入 A(B(E,C(D(F(,G),),) 输出 二叉树高度为: 6 代码实现 #include <iostream> //#include &l…

二叉树4:二叉树求树高度(超级详细)

一、思路 什么是树高&#xff1f; 树的高度(或深度)就是树中结点的最大层数。 在这里使用后序遍历的递归算法。 对每一个结点都进行如下操作&#xff1a; 后序遍历其左子树求树高后序遍历其右子树求树高对这个结点进行下面操作&#xff1a; 比较其左右子树的高度大小若左&g…