×

汉诺塔python代码

汉诺塔python代码(python汉诺塔非递归)

shqlly shqlly 发表于2022-12-25 13:30:00 浏览129 评论0

抢沙发发表评论

本文目录

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

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大神帮忙解释一下 这个汉诺塔程序的步骤

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’)

  1. 例如n=3

  2. move(2,a,c,b)自循环

  3. move(1,a,b,c)

  4. move(2,b,a,c) 自循环

  5. 循环完毕,输出

你这段代码也是类似自循环

python利用递归解决汉诺塔问题,求大神解释一下代码

这是一个典型的递归程序
当只有一层的时候,直接把x放到z上结束
当大于1层的时候,先把x和z放到y上,然后继续递归
把y放到x上,然后放到z上,结束处理

如何理解这段汉诺塔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个盘子的问题。

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。
整个过程挺直白的,想通了就明白了

python请用递归算法编程解决汉诺塔问题 在线等

这是Python3系统自带的一个例子,估计就是这个意思,本来他是6个盘子,按照你要求改成4个了。递归算法没问题,描述也非常详细 ;)

#!/usr/bin/env python3
from 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 d
def 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 STOP
def 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()

标题:用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(“请输入汉诺塔的层数 :“))
hano()(n,’source’,’helper’,’target’)
print(“The total number of steps required is: “,str(count))

-----------分-割-线-是-我----------------

复制分割线以上的代码,保存为hannoi.py,在python 3 下运行,得到结果如题所示。

python汉诺塔算法如何添加统计移动次数的代码

方案1:命令窗口运行文件方式

s=0
def move(n,a,b,c):
    global s
    if n==1:
        s=s+1
        print(a,’--》’,c)
        return 
    move(n-1,a,c,b)
    move(1,a,b,c)
    move(n-1,b,a,c)
n = int(input(’num: ’))
move(n,’A’,’B’,’C’)
print(’total: %s’%s)

方案2:交互模式(建立函数文件jichu.py,在交互窗口调用文件中函数move)

s=0
def move(n,a,b,c):
    global s
    if n==1:
        s=s+1
        print(a,’--》’,c,’\t%s’ % s)
        return 
    move(n-1,a,c,b)
    move(1,a,b,c)
    move(n-1,b,a,c)

python 递归汉诺塔求解代码问题

报错意思是变量n没有被定义。
你把层数传给hanoi了。
把hanoi=(int(input(’请输入汉诺塔层数’)))里的hanoi改为n就行了,其他不用改