python解决汉诺塔问题?

作者&投稿:芷司 (若有异议请与网页底部的电邮联系)
python请用递归算法编程解决汉诺塔问题 在线等~

这是Python3系统自带的一个例子,估计就是这个意思,本来他是6个盘子,按照你要求改成4个了。递归算法没问题,描述也非常详细 ;)
#!/usr/bin/env python3from turtle import *class Disc(Turtle): def __init__(self, n): Turtle.__init__(self, shape="square", visible=False) self.pu() self.shapesize(1.5, n*1.5, 2) # square-->rectangle self.fillcolor(n/6., 0, 1-n/6.) self.st()class Tower(list): "Hanoi tower, a subclass of built-in type list" def __init__(self, x): "create an empty tower. x is x-position of peg" self.x = x def push(self, d): d.setx(self.x) d.sety(-150+34*len(self)) self.append(d) def pop(self): d = list.pop(self) d.sety(150) return ddef hanoi(n, from_, with_, to_): if n > 0: hanoi(n-1, from_, to_, with_) to_.push(from_.pop()) hanoi(n-1, with_, from_, to_)def play(): onkey(None,"space") clear() try: hanoi(6, t1, t2, t3) write("press STOP button to exit", align="center", font=("Courier", 16, "bold")) except Terminator: pass # turtledemo user pressed STOPdef main(): global t1, t2, t3 ht(); penup(); goto(0, -225) # writer turtle t1 = Tower(-250) t2 = Tower(0) t3 = Tower(250) # make tower of 6 discs for i in range(4,0,-1): t1.push(Disc(i)) # prepare spartanic user interface ;-) write("press spacebar to start game", align="center", font=("Courier", 16, "bold")) onkey(play, "space") listen() return "EVENTLOOP"if __name__=="__main__": msg = main() print(msg) mainloop()

教大家玩汉诺塔规则和训练递归方法

解汉诺塔最简单的做法就是递归:

类似如何将大象装进冰箱:1)将冰箱门打开;2)把大大象放进去;3)把冰箱门关上……

我们将所有的盘都在同一个杆上从大到小排列视为【完美状态】,那么,目标就是将最大盘片为n的完美状态从a杆移到b杆,套用装大象的思路,这个问题同样是三步:

1)把n-1的完美状态移到另一个杆上;

2)把n移到目标杆上;

3)把n-1的完美状态移到目标杆上。

如下:




定海区15136755012: 标题:用Python编码描述汉诺塔步骤 -
越皇同贝: #-*- coding:utf-8 -*- count = 0 def hano(): def hanoi(n,x,y,z): global count count += 1 if n == 1: print('Monving %d' % n, 'from ',x,'to',z) else: hanoi(n-1,x,z,y) print('Monving %d' % n, 'from ',x,'to',z) hanoi(n-1,y,x,z) return hanoi n = int(input("请输入汉诺塔的...

定海区15136755012: python 汉诺塔问题 如图,为什么打印完 A→B 时n还是等于1? -
越皇同贝: 3,4,5在递归的层级上都是在2下的,它们3个是同级,它们使用的实参都是2传给它们的.所以都用的同一个实参变量n,所有n-1都是1.

定海区15136755012: python语言汉诺塔(hanoi)问题 -
越皇同贝: move(n, A, B) 就表示把第n个饼从A柱移到B柱, 其中step是个全局变量,用来记录移动的次数.hanoi(n, A, B, C) 就是你所问的实现递归的函数, 表示把n个饼从A柱通过B柱移到C柱. 其中 n==1 是递归的最基本的情况, 如果只有一个饼就直接移到目标柱子即可. 不然呢我们就先把最上面n-1个饼从A通过C移到B,注意这里移到的是B柱哦~, 然后把第n块饼移到C柱,再重新把之前移到B柱上的n-1个饼通过A移动到C.整个过程挺直白的,想通了就明白了

定海区15136755012: 关于python递归函数实现汉诺塔 -
越皇同贝: 仔细看一下 5-7行调用 move 时候的参数顺序, 不是你说的那样没有变:#5 的含义是将 A 上的前 n-1 个移动到 B#6 : 将 A 最后一个移动到 C#7: 将 B 上的 n-1 (即#5 从 A 移动过来的 n-1) 个移动到 C

定海区15136755012: python的汉诺塔编码总报语法错误? -
越皇同贝: 递归方法有些时候是不太好理解,不过递归的意义就是把解决问题n变成解决n-1的问题,最终变成解决1个问题. 假设有n个盘子,从上到下依次编号,最下面的盘子编号是大写的N.托盘分别是x,y,z.要把所有盘子从x移动到z. 前面几行代码就不解释了,很容易理解. 第五行,如果只有一个盘子,就直接从x移动到z. 第七行,如果不只一个盘子,先把上面n-1个盘子从x移动到y. 第八行,再把N号盘子从x移动到z. 第九行,再把刚才那n-1个盘子从y移动到z.至于那n-1个盘子是怎么移动的,再次调用这个函数,把问题变成n-2个盘子加1个盘子的问题.

定海区15136755012: c语言编程问题,求解.(汉诺塔) -
越皇同贝: 恩 昨天用 python 写的 c语言版本#include //第一个塔为初始塔,中间的塔为借用塔,最后一个塔为目标塔 int i=1;//记录步数 void move(int n,char from,char to) //将编号为n的盘子由from移动到to {printf("第%d步:将%d号盘子%c---->%c\n",i++...

定海区15136755012: 汉诺塔问题 -
越皇同贝: 汉诺塔问题是典型的递归问题,解题的关键就是将这个问题逐步进行分解,直到最后剩1个盘子的时候一步完成.基本上,汉诺塔可以可以用下面的方式实现:void move(char x, char y) {cout"} void hanoi(int n,char one,char two,char three) {if (n ...

定海区15136755012: 汉诺塔问题思路 -
越皇同贝: 汉诺塔这个问题,在考虑它递归的时候,别想着我们真实移动的步骤,我当时也总是觉得很乱.你要这样考虑: 1, 2, 3 最初都在1上,最后要移动到3上.所以把除了最后一块都移动到2上,最后一块移动到3上,再把2的都移动到3上.这个过程...

定海区15136755012: 汉诺塔问题(编程)
越皇同贝: 1个盘子移动1次.2个盘子移动3次. 3个盘子移动7次...... 所以移动次数就是2^n-1. 时间复杂度就是O(2^n); 具体代码如下: #include<iostream> using namespace std;int N=0; void Hanoi( int n, char A, char B, char C) { if(n==1) { cout<<"第"<<++...

定海区15136755012: 汉诺塔问题算法 -
越皇同贝: 用递归实现:#include void Towers(int n, char fromPeg, char auxPeg, char toPeg) { if (1 == n) //递归出口 { coutreturn; } //把n-1个盘子从fromPeg借助toPeg移动到auxPeg Towers(n - 1, fromPeg, toPeg, auxPeg); //把盘子n由fromPeg直接移动到...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网