⑴ 求python大神帮忙解释一下 这个汉诺塔程序的步骤
def my_print(args):
print args
def move(n, a, b, c):
my_print ((a, '-->', c)) if n==1 else (move(n-1,a,c,b) or move(1,a,b,c) or move(n-1,b,a,c))
注释:汉诺塔模型输入move (n, 'a', 'b', 'c')
例如n=3
move(2,a,c,b)自循环
move(1,a,b,c)
move(2,b,a,c) 自循环
循环完毕,输出
你这段代码也是类似自循环
⑵ 【python】汉诺塔递归
系统自带的演示代码,可以研究一下
#!/usr/bin/envpython3
"""turtle-example-suite:
tdemo_minimal_hanoi.py
Aminimal'TowersofHanoi'animation:
lefttotherightpeg.
Animhoquiteelegantandconcise
,which
isderivedfromthebuilt-intypelist.
Discsareturtleswithshape"square",but
()
---------------------------------------
ToexitpressSTOPbutton
---------------------------------------
"""
fromturtleimport*
classDisc(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()
classTower(list):
"Hanoitower,asubclassofbuilt-intypelist"
def__init__(self,x):
"createanemptytower.xisx-positionofpeg"
self.x=x
defpush(self,d):
d.setx(self.x)
d.sety(-150+34*len(self))
self.append(d)
defpop(self):
d=list.pop(self)
d.sety(150)
returnd
defhanoi(n,from_,with_,to_):
ifn>0:
hanoi(n-1,from_,to_,with_)
to_.push(from_.pop())
hanoi(n-1,with_,from_,to_)
defplay():
onkey(None,"space")
clear()
try:
hanoi(6,t1,t2,t3)
write("pressSTOPbuttontoexit",
align="center",font=("Courier",16,"bold"))
exceptTerminator:
pass#turtledemouserpressedSTOP
defmain():
globalt1,t2,t3
ht();penup();goto(0,-225)#writerturtle
t1=Tower(-250)
t2=Tower(0)
t3=Tower(250)
#maketowerof6discs
foriinrange(6,0,-1):
t1.push(Disc(i))
#preparespartanicuserinterface;-)
write("pressspacebartostartgame",
align="center",font=("Courier",16,"bold"))
onkey(play,"space")
listen()
return"EVENTLOOP"
if__name__=="__main__":
msg=main()
print(msg)
mainloop()
⑶ python汉诺塔问题,结果怎么会出线移动过程
你居然在这儿也发帖,为了赚财富值我也是拼了,
print 'a', '-->', 'c', 你改成这样,你会发现打印出来的都是一样,因为这里面 a c都是字符
print a, '-->', c ,这儿的 a,c是函数传入的变量, 在函数运行的过程中, a b c指向的变量是不同的
move(n - 1, a, c, b)
move(n - 1, b, a, c)
我在代码中加了一点注释,希望有用, 你要是实在看不明白很正常,递归函数需要一点时间理解
http://www.liaoxuefeng.com/wiki//
⑷ python 初学者关于汉诺塔的问题
这是递归函数。
这是Python3系统自带的一个例子,估计就是这个意思,本来他是6个盘子,按照你要求改成4个了。递归算法没问题,描述也非常详细 ;)
#!/usr/bin/envpython3
fromturtleimport*
classDisc(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()
classTower(list):
"Hanoitower,asubclassofbuilt-intypelist"
def__init__(self,x):
"createanemptytower.xisx-positionofpeg"
self.x=x
defpush(self,d):
d.setx(self.x)
d.sety(-150+34*len(self))
self.append(d)
defpop(self):
d=list.pop(self)
d.sety(150)
returnd
defhanoi(n,from_,with_,to_):
ifn>0:
hanoi(n-1,from_,to_,with_)
to_.push(from_.pop())
hanoi(n-1,with_,from_,to_)
defplay():
onkey(None,"space")
clear()
try:
hanoi(6,t1,t2,t3)
write("pressSTOPbuttontoexit",
align="center",font=("Courier",16,"bold"))
exceptTerminator:
pass#turtledemouserpressedSTOP
defmain():
globalt1,t2,t3
ht();penup();goto(0,-225)#writerturtle
t1=Tower(-250)
t2=Tower(0)
t3=Tower(250)
#maketowerof6discs
foriinrange(4,0,-1):
t1.push(Disc(i))
#preparespartanicuserinterface;-)
write("pressspacebartostartgame",
align="center",font=("Courier",16,"bold"))
onkey(play,"space")
listen()
return"EVENTLOOP"
if__name__=="__main__":
msg=main()
print(msg)
mainloop()
⑹ python解决汉诺塔问题
解汉诺塔最简单的做法就是递归:
类似如何将大象装进冰箱:1)将冰箱门打开;2)把大大象放进去;3)把冰箱门关上……
我们将所有的盘都在同一个杆上从大到小排列视为【完美状态】,那么,目标就是将最大盘片为n的完美状态从a杆移到b杆,套用装大象的思路,这个问题同样是三步:
1)把n-1的完美状态移到另一个杆上;
2)把n移到目标杆上;
3)把n-1的完美状态移到目标杆上。
如下:
⑺ 汉诺塔python
Solves the Towers of Hanoi problem on n discs. The discs are labeled
* in increasing order of size from 1 to n and the poles are labeled
* A, B, and C.
*
* % java Hanoi 3
* Move disc 1 from A to C
* Move disc 2 from A to B
* Move disc 1 from C to B
* Move disc 3 from A to C
* Move disc 1 from B to A
* Move disc 2 from B to C
* Move disc 1 from A to C
以上为模拟结果,从结果中找递归规律,你的疑点也能得到解决
⑻ python汉诺塔非递归
python汉诺塔非递归,运用list和function知识的解答
无论stack还是recursion都是从汉诺塔的原理去解决问题,但如果已经想清楚汉诺塔的原理,其实只用把答案print出来就行了
先找规律:
一层:A-->C
两层:A-->B
-------
A-->C
-------
B-->C
三层:A-->C
A-->B
C-->B
-------
A-->C
-------
B-->A
B-->C
A-->C
注意到n层汉诺塔有(2**n) - 1 个步骤,而中间的一步(两个分割线之间)都是“A-->C”,中间的这一步将这一层汉诺塔的解分为上下两个部分
仔细观察,上面一部分是将上一层的解中所有的B,C交换,下面一部分是将上一层的解中所有的A,B交换
例如第二层是:
A-->B
A-->C
B-->C
第三层上部分就将第二层的解的C换成B,B换成C,即得出:
A-->C
A-->B
C-->B
第三层下部分就将第二层的解的A换成B,B换成A,即得出:
B-->A
A-->C
C-->B
这个规律同样适用于第一层,和以后的所有层
然后就好办了,代码如图:
代码
其中convertAB,convertBC就是AB交换,BC交换的函数,这两个函数可以自己定义,用中间变量即可
⑼ python 汉诺塔问题 如图,为什么打印完 A→B 时n还是等于1
3,4,5在递归的层级上都是在2下的,它们3个是同级,它们使用的实参都是2传给它们的。所以都用的同一个实参变量n,所有n-1都是1。