首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我正在尝试用Python制作“汉诺塔”,但是我的从一个列表移动到另一个列表的方法似乎行不通

汉诺塔(Tower of Hanoi)是一个经典的数学问题,它可以通过递归算法来解决。在Python中,我们可以使用列表来模拟汉诺塔的三个柱子。

首先,我们需要定义一个函数来移动盘子。这个函数接受四个参数:源柱子(source)、目标柱子(target)、辅助柱子(auxiliary)和要移动的盘子数量(n)。

代码语言:txt
复制
def move_disk(source, target, auxiliary, n):
    if n == 1:
        # 当只有一个盘子时,直接将盘子从源柱子移动到目标柱子
        target.append(source.pop())
        print("Move disk from", source, "to", target)
    else:
        # 将 n-1 个盘子从源柱子移动到辅助柱子
        move_disk(source, auxiliary, target, n-1)
        # 将最底下的盘子从源柱子移动到目标柱子
        target.append(source.pop())
        print("Move disk from", source, "to", target)
        # 将 n-1 个盘子从辅助柱子移动到目标柱子
        move_disk(auxiliary, target, source, n-1)

接下来,我们可以编写一个主函数来调用移动盘子的函数,并传入初始状态的柱子。

代码语言:txt
复制
def main():
    n = 3  # 汉诺塔的盘子数量
    source = [3, 2, 1]  # 初始状态的源柱子
    target = []  # 初始状态的目标柱子
    auxiliary = []  # 初始状态的辅助柱子

    move_disk(source, target, auxiliary, n)

if __name__ == "__main__":
    main()

以上代码将输出每一步的移动过程,例如:

代码语言:txt
复制
Move disk from [3, 2] to [1]
Move disk from [3] to [1, 2]
Move disk from [] to [1, 2, 3]
Move disk from [1] to [2, 3]
Move disk from [] to [1]
Move disk from [2] to [1, 2]
Move disk from [] to [1, 3]
Move disk from [2] to [3]
Move disk from [1, 2] to [3]
Move disk from [1] to []
Move disk from [1, 2] to []
Move disk from [] to [1, 2]
Move disk from [] to [1, 2, 3]
Move disk from [3] to [1, 2]
Move disk from [] to [1]
Move disk from [2] to [1, 2]
Move disk from [] to [1, 3]
Move disk from [2] to [3]
Move disk from [1, 2] to [3]
Move disk from [1] to []
Move disk from [1, 2] to []

这样,我们就成功地用Python制作了汉诺塔游戏。在这个例子中,我们使用了列表来表示柱子,通过不断地移动盘子,最终将所有盘子从源柱子移动到目标柱子。

关于云计算、IT互联网领域的名词词汇以及腾讯云相关产品和产品介绍链接地址,由于要求不能提及具体的品牌商,我无法提供相关信息。但是你可以通过搜索引擎或腾讯云官方网站来获取相关的知识和信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

问题

问题 学递归,跳不过这个程序。以前弄NOIP,老师很详细地讲过原理以及实现算法,不过上大学了却发现老师讲到,只是像一笔带过,原理都没讲通,更别说算法了。...相信像他那么讲,没一同学(没基础)能弄得懂,就算你给一flash游戏,也不见得会玩。 真的挺有意思写这篇文章,也算是回忆回忆以前学过知识。如果有什么错误,还请原谅。...如果你以前没有任何递归基础,也许你看不懂这些代码。如果你知道递归一些知识,你才会发现这道题实际上十分基础。但是如果不用递归来做,想没多少人能把程序写出来。...这些东西也许只有等我们做了更多题,接触了更多有关树和图问题以后才能理解吧。 最后给大家和我自己留一问题:是三根柱子,如果我们有四根柱子,我们又怎样移动盘子,或者说怎样移动使步数最少?...有时间我会想想这个问题,以后写一拓展”。 把程序传到附件里了,大家可以下载运行了试试。

1.2K21

多柱最优算法设计探究

对于三柱算法正确性自然是毫无争议,我们需要是从三柱设计中引申出多柱设计方法。 2....首先我们会想到,三柱需要借助另一个柱子存放前n-1盘子,再把第n盘子移动到目的位置。...这样我们看到我们自己亲手构建算法模式如此完美,我们甚至不忍心去破坏它。但是很遗憾告诉自己,这种算法虽然正确,却不是最优!!!...或许在盘子较少情况下是可行但是盘子增多时,那些多余只有一盘子柱子是可以加以利用。虽然这么做加多了每次移动步数,但是却从另一个侧面减少了递归数量,因此我们需要从这里边找一平衡点。...总结 通过以上讨论,我们从一思维——不折叠盘子,出发去找多柱最优解,但是结果并没有成功——盘子多时有可能柱子没有充分利用。

2.2K90

Python 进阶指南(编程轻松进阶):十四、实践项目

让我们通过查看两命令行游戏源代码来实践这些技术:和四人一排。 这些项目很短,并且基于文本,以保持它们范围较小,但是它们展示了本书到目前为止概述原则。... 拼图使用一叠不同大小圆盘。圆盘中心有孔,所以你可以把它们放在三杆子中上面(图 14-1)。要解决这个难题,玩家必须将一叠圆盘移到另一个柱子上。...如果我们使用append()方法进行推送,使用pop()方法进行弹出,并且避免以任何其他方式改变列表,我们可以将 Python 列表转换成栈。我们将列表末尾视为栈顶部。...总结 益智游戏和四人一排游戏是简短程序,但是通过遵循本书中实践,您可以确保它们代码可读并且易于调试。...在中,我们将这三座表示为一字典,包含关键字'A'、'B'和'C',它们值是整数列表。这是可行但是如果我们程序更大或者更复杂,用一类来表示这些数据是一好主意。

82631

Hanoi单问题

问题是一很经典递归问题(当然也可以用迭代方式解决,但是就复杂很多) 本题英文版是这样: (出自C++大学教程英文版第226页) The Towers of Hanoi is one...n=2时,需要借助第二根柱子来进行操作,先把一碟子移到2柱,再从1柱碟子到3柱,最后把二柱碟子移动到3柱。...就是最终他们都可以被分解为从一柱子移动到另一个柱子操作。 再继续分析,得出思路,只要先把n-1碟子移动到2柱,再把第n碟子从1柱移动到3柱,最后把n-1碟子从2柱移动到3柱。就完成了。...如此循环就会发现,不管是多少柱子,问题都能被分解为最小单位——从一柱子移动到另一个柱子问题。 那么我们会发现,这个问题可以每一步操作都是一样,都能往下细分直至分解为n=1时情景。...再接下去分析,就发现我们在每次递归时候,需要传入4参数,即要本次目标要移动碟子数量、从哪里、到哪里去、临时柱子是哪根。

51720

问题(利用递归解决)内含斐波那契数列0.o

首先,我们来看看什么是吧~记得初知,就是在今年暑假游览科技馆时候,里面就有游戏,当然耐心烦躁并没有解决,没想到今日学习c语言还能看见它(捂脸)。...介绍 传说印度教主神梵天在创造世界时候,在其中一根针上从下到上地穿好了由大到小64片金片,这就是所谓。...问题是一经典递归问题,规定了三根柱子(A、B、C),其中A柱上有n圆盘,按照从大到小顺序堆叠。...思路讲解 我们要把第一杆子以小在上,大在下原则移走,想要把第三圆盘移走,那么前两就不能移动,所以我们得把前两放置到B上。...但是要想把前两放置到B上,就得把最小圆盘先移走,再把中等大小圆盘放在B上,最后把最小圆盘回B,此时就可以移动最大圆盘到C上。

12610

Python编程 深入浅出递归

文章目录 一、初识递归 二、进制转换 三、递归可视化 四、问题求解 五、总结 一、初识递归 递归(Recursion)是一种解决问题方法,其精髓在于将问题分解为规模更小相同问题,持续分解,直到问题规模小到可以用非常简单直接方式来解决...问题来源:来源于印度传说故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从上往下从小到大顺序摞着 64 片黄金圆盘。...恩,当然这个传说并不可信,如今更多是作为一玩具存在。...推荐一可以在线玩小游戏网站: http://www.htmleaf.com/Demo/201508272485.html 3 盘子演示如下: 思路: 将盘片从开始柱,经由中间柱...,移动到目标柱:首先将上层N-1盘片盘片,从开始柱,经由目标柱,移动到中间柱;然后将第N(最大)盘片,从开始柱,移动到目标柱; 最后将放置在中间柱 N-1 盘片盘片,经由开始柱,移动到目标柱

39910

如何理解分治思想

image.png 相信大家都玩过吧,那么是如何来呢? 传说越南河内某间寺院有三根银棒,上串 64 金盘。...对于只有一盘子,可以表示为: image.png 对于有两盘子, 可以表示为: 相互连接三角形, 组成了一较大三角形角。...最外面的三角形边, 表示了盘子从一柱子移动到另一个柱子最快方式....最大三角形可以沿着中线分成三次小三角形, 就是上面由二级组成三级逆向操作, 次小三角形相互之间连线, 表示着最大盘子移动方式....设Nh是将有h盘子, 将所有盘子从一柱子移动到另一个柱子非相交路径数量(一开始盘子都在一柱子上).

43570

Python3实现问题

Python3实现问题 一、思路 二、Python3代码实现 三、总结 四、参考资料 一、思路 总结归纳为以下3步: 把x上n-1盘子借助z,移动到y上 把x上最下面的盘子移动到z上 最后把y...上n-1盘子借助x移动到,z上,大功告成 递归出口:n=1时,直接从x移动到z上 二、Python3代码实现 # Python3递归实现游戏 def hannota(n,x,y,z): #...游戏是递归调用,在函数调用过程中,栈问题需要注意,递归函数一层一层深入调用,但是每调用一层,函数不是马上返回,而是放在栈中,相应局部变量也是存在在里面,只有当调用到n=1时,函数才一返回...中间有一递归函数返回出问题,都会导致最后结果出错。 游戏移动次数问题其实是一很经典等比数列问题。...四、参考资料 通过问题理解递归精髓 递归经典案例 python实现 形参和实参区别 程序实现—Python 及其具体运行步骤

68220

手撕“算法”之详细图解

hello,你好呀,是灰小猿,一超会写bug程序猿, 今天和大家分享一递归经典算法案例---“”。...我们仅能找出问题解决方法并解决较小N值时,但很难用计算机解决64层。 在平常编程练习过程中,问题也是一十分常见算法案例。...今天就和小伙伴们具体分析一下问题解决方案。...首先我们来看一三层图解,来对问题解决有一简单了解: 如上图所示,我们可以看出,当盘子数量只有一时候,我们可以直接将盘子移动到目标盘,在进行三层问题解决时。...接下来分别使用java和Python向大家演示一下n阶求解方法: Java求解 package 算法; public class Hanoi { public static

1.6K20

用js来实现那些数据结构05(栈02-栈应用)

正是利用了栈特性。 3、 什么是相信很多人小时候都玩过,有图有真相,没图不BB。 ?   ...在开始玩游戏之前,先给大家说一下游戏规则:     规则一:每次操作只能移动一圈圈,把它从一柱子移到另一个柱子上。     规则二:大圈圈不能架在小圈圈上面。   ...这是游戏规则,那么换作程序的话,规则是这样:假设这里有三根相邻柱子,标号为A,B,C,A柱子上由下到上按金字状叠放着n不同大小圆盘,要把所有盘子一动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方...理解,1、目的是把这个从一柱子依照由下到上顺序完整动到另一个柱子上,        2、大圈不能在小圈之下,但是可以隔层放置大小圈,比如八号最大,越往上越小,那么在移动过程中,5号是可以放在...return towerOfHanoi(plates, source, helper, dest, 'source', 'helper', 'dest'); } //这个方法是计算在层数为plates

83270

用js来实现那些数据结构05(栈02-栈应用)「建议收藏」

大家好,又见面了,是你们朋友全栈君。   上一篇文章我们一起实现了栈,那么这一篇文章我们一起来用栈解决问题。看看如何用栈来解决进制转换,平衡圆括号以及问题,使我们对栈有更为深入理解。...正是利用了栈特性。 3、 什么是相信很多人小时候都玩过,有图有真相,没图不BB。   ...在开始玩游戏之前,先给大家说一下游戏规则:     规则一:每次操作只能移动一圈圈,把它从一柱子移到另一个柱子上。     规则二:大圈圈不能架在小圈圈上面。   ...理解,1、目的是把这个从一柱子依照由下到上顺序完整动到另一个柱子上,        2、大圈不能在小圈之下,但是可以隔层放置大小圈,比如八号最大,越往上越小,那么在移动过程中,5号是可以放在...return towerOfHanoi(plates, source, helper, dest, 'source', 'helper', 'dest'); } //这个方法是计算在层数为plates

30320

一起玩转

(又称河内)问题是源于印度一古老传说益智玩具。大梵天创造世界时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。...并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一圆盘。 后来,这个传说就演变为游戏,玩法如下: 1.有三根杆子A,B,C。...回到前面问题上来。我们假设函数func(n, a, b, c)用于将n圆盘由a移动到c,b作为辅助柱子。那么我们可以这样实现这个递归过程: func: if n!...a,c) move(4, 'A', 'B', 'C')''' 把3盘子全部通过代码演示, 按缩进原则,每一缩进即进一递归函数, 每打印一次即中止当前递归,也就是每个print 说明:...a 扩展:问题非递归实现 这种算法看得头疼,直接传送门吧 https://tieba.baidu.com/f?

83350

Python数据结构与算法】--- 递归算法应用-五行代码速解问题.

两层演示 三层走法演示 不知道有没有朋友跟我一样有一疑问,如果我们顶端先放到中间柱子呢?...但是实际上问题解决方案都是最优解,我们不走弯路,我们目的性非常强,我们最终目的都是移动到c,所以我们可以先让顶端木块直接到c 解题思路: 不妨将这个问题拆解,n,我们可以把最底下最大那个看成单独...,上面的(n - 1),看成一整体.这样子最底下那个可以直接从 A 移动到 C,剩下上面的 ( n - 1 ) 我们可以先从A 通过 C 移动到 B ....这里是青蛙跳台阶Python递归实现: def frog_jump(n): if n == 1: return 1 elif n == 2: return...需要注意是,这种递归实现虽然简单易懂,但是时间复杂度为指数级别的,所以不能用于大规模数据处理。

11810

【愚公系列】2023年12月 五大常用算法(一)-分治算法

问题:将 n 盘子从原始柱子移动到目标柱子,需要将 n-1 盘子从原始柱子移动到辅助柱子,然后将最后一盘子从原始柱子移动到目标柱子,最后将 n-1 盘子从辅助柱子移动到目标柱子,递归执行这个过程即可...:"); PrintUtil.PrintTree(root); } } 4.问题 问题可以通过分治算法来解决。...分治算法是将问题分解成若干个小子问题来解决,最后将子问题结果合并起来得到最终解决方案。 在问题中,我们可以将分解为三部分,分别为起始、中转和目标。...将起始前n-1盘子移动到中转塔上。 将起始塔上第n盘子移动到目标塔上。 将中转塔上n-1盘子移动到目标塔上。 这个过程可以看做是一递归过程。...下面是使用分治算法来解决问题代码: public class hanota { /* 移动一圆盘 */ public void move(List src, List

27722

第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-933

第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-933 ---- 目录 第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-933 前言 关于数学疑问 算法训练... C语言 C++语言 Java语言 Python语言 总结 第六届——第十三届省赛题解 第六届——第十二届国赛题解 ---- 前言         这段时间我会把蓝桥杯官网上所有非VIP题目都发布一遍...——但是由于智商有限,步骤多了容易手滑,于是他请求小伙伴们来帮他,人家才不是cheat呢。...游戏规则   同相似,不过有4,要求将盘子从1运到4。 输入格式   一数n表示盘子数。 输出格式   第一行输出step表示你操作步数。   ...语言 相对简洁,但是需要对Python一些语法很了解,特别是列表推导式熟悉。

20230

AI时代,陪孩子玩什么游戏?| 前Google资深工程师实战心法

游戏特别经典,暗藏了分治法、递推和递归等重要思想。 非非七岁生日前后,跟他第一次玩了。非非有特点,要玩什么或者学什么,最好得有好玩故事当“诱饵”。...这一次,游戏复杂度不仅提高了一倍(以移动次数来计算),孩子也会从一初始状态开始,自己来验证刚才总结规律是否正确。 非非玩四本书玩了很久。...依靠强大逻辑思维,小北一分钟内就自己解决了四层问题。挑战五层,小北只花了十几分钟。 然后,小北不顾“劝阻”,执意挑战六层。...小北玩成绩,似乎还说明了另一个问题:在理工科特别需要逻辑思维方面,女孩子一点儿也不差,还有可能做得更好。...游戏另一个价值,是让只学过加减法小孩子,直观地感受到由“乘方”引起数量大幅变化。

65410

python内置数据结构list、set、dict、tuple(一)

问题 规则: 每次只能移动一盘子 任意一次移动,三状态必须是小盘子在上,大盘子在上 方法: n=1:直接把A上盘子移动到C上,A->C n=2: 把小盘子从A放到B上,A->B 把大盘子从...A放到C上,A->C 把小盘子从B放到C上,B->C n=3: 把A上盘子,通过C移动到B上去,调用递归实现 把A上剩下最大盘子移动到C上,A->C 把B上两盘子,借助于A,挪到C上去,调用递归...n=n: 把A上n-1盘子,借助于C,移动到B上去,调用递归 把A上最大盘子,也是唯一一,移动到C上去,A->C 把B上n-1盘子,借助于A,移动到C上去,调用递归 def hano(n,...a, b, c): ''' 递归实现 n:代表几个 a:代表第一,开始 b:代表第二,中间过渡 c:代表第三,目标...:List content 通过简单方法创作列表 # for 创建 a = ['a', 'b', 'c'] # 用List a创建一List b # 下面的代码含义是,对于所有a中元素,逐个放入新列表

1K107

图解问题( Java 递归实现)

简介 最近在看数据结构和算法,遇到了一非常有意思问题——问题。 先看下百度百科是怎么定义规则(又称河内)问题是源于印度一古老传说益智玩具。...下面通过图解方式,演示整个移动过程,帮助你理解用递归解决这个问题思想。 图解 我们一步一步从简单到复杂。为了方便,把三柱子从左到右分别叫 A,B,C。盘子数字从上到下依次增大。...这个过程可以表述为: 把第1盘子从A移到B 把第2盘子从A移到C 把第1盘子从B移到C 三盘子 三盘子时候,稍微复杂一些,但是我们一般也是可以通过心算,把过程推演出来。 ?...A 柱子) 但是,这只是我们把它抽象出来过程,游戏中不允许我们整体移动,怎么办呢。...感兴趣你也可以尝试用程序跑一遍 64 片是什么结果,估计就算你机器性能很好,也得跑好长时间。。。 温馨提示:机器炸了不怪我哦 ~

80910

递归太难理解了_函数定义时可以用递归吗

大家好,又见面了,是你们朋友全栈君。 记得第一次做这道题时,是2017年11月。当时,坐在山大青岛校区图书馆3楼,不知怎么地,看到了这个题。...给了终止条件,计算机才能进行求解子问题并回溯,最终求出f(n) 对于这个问题,在写递归时,我们只需要确定两条件: 1.递归何时结束? 2.递归核心公式是什么?...即: 怎样将n盘子全部移动到C柱上? 即:若使n盘子全部移动到C柱上,上一步应该做什么? 下面正式进入该题: 问题是一经典问题。...(Hanoi Tower),又称河内,源于印度一古老传说。大梵天创造世界时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。...显然,为了说明第几步将哪个盘子从哪个柱子移动到哪个柱子上,我们参数列表至少应该包含: id,表示被移动盘子序号。

72830

3145 游戏

3145 游戏  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver  查看运行结果 题目描述 Description 问题(又称为河内问题),是一大家熟知问题...在A,B,C三根柱子上,有n不同大小圆盘(假设半径分别为1-n吧),一开始他们都叠在A上(如图所示),你目标是在最少合法移动步数内将所有盘子从A动到C。...游戏中每一步规则如下: 1. 每一步只允许移动一盘子(从一根柱子最上方到另一个柱子最上方) 2....Description 一整数n 输出描述 Output Description 第一行一整数k,代表是最少移动步数。...接下来k行,每行一句话,N from X to Y,表示把N号盘从X柱移动到Y柱。

97770
领券