2

我在 python 中为“河内之塔”编写了一个代码,我正在尝试添加一个计数器来显示它运行了多少次。我尝试了几种方法,例如 while 循环和 for 循环等,但它不起作用。我确信答案很简单,但我的大脑现在正在最低设置下运行。我的代码如下所示:

def Hanoi(n, src, dst, tmp):
if n > 0:
    Hanoi(n - 1, src, tmp, dst)
    print "Move disc", chr(64 + n), "From tower", src, "to tower", dst
    Hanoi(n - 1, tmp, dst, src)

Hanoi(4,0,2,1) #Just an example

我知道代码必须运行 (2^n)-1 次,但我无法实现它。因为我编写代码的方式,值 n 发生了变化,所以这对我有用。(我尝试过这样的事情:

def Hanoi(n, src, dst, tmp):

    a = 0
    while (a < (2**n)-1)
        a+=1

    if n > 0:
        Hanoi(n - 1, src, tmp, dst)
        print a, "Move disc", chr(64 + n), "From tower", src, "to tower", dst
        Hanoi(n - 1, tmp, dst, src)

但正如我所说,值 n 改变了,我不知道如何解决它。

编辑:

为了澄清,我希望它像这样购买步骤数:(如果我打电话给 Hanoi(3,0,2,1))

1. Move disc A From tower 0 to tower 2
2. Move disc B From tower 0 to tower 1
3. Move disc A From tower 2 to tower 1
4. Move disc C From tower 0 to tower 2
5. Move disc A From tower 1 to tower 0
6. Move disc B From tower 1 to tower 2
7. Move disc A From tower 0 to tower 2
4

4 回答 4

3

如何从您的函数返回调用次数:

def Hanoi(n, src, dst, tmp):
    if n > 0:
        pre = Hanoi(n - 1, src, tmp, dst)
        print "Move disc", chr(64 + n), "From tower", src, "to tower", dst
        post = Hanoi(n - 1, tmp, dst, src)
        return pre + post + 1
    else:
        return 1

请注意,这会计算对Hanoi函数的调用次数,而不是实际玩游戏时实际需要进行的移动次数。如果您想要移动次数,只需return 1将基本情况(最后一行)中的 更改为return 0

于 2014-02-19T09:42:24.127 回答
2

还有另一种不使用“全局”的解决方案。因为不是每种语言都有它。

count = 0
def Hanoi(count , n , a, c, b):
    if(n == 1):
        print(count,": Moving disk 1 from",a,"to",c)
        count+=1
        return count
    count = Hanoi(count , n-1, a, b, c)
    print(count , ": Moving disk",n,"from",a,"to",c)
    count+=1
    count = Hanoi(count , n-1, b, c, a)
    return count

Hanoi(count , 3, 'A', 'C', 'B')
于 2020-10-15T10:41:26.567 回答
0

1.def 河内(n,s,t,b):

   assert n > 0
    if n == 1:
        print 'move',s,'to',t
        return 1     #######count number of iteration
    else:
        first=hanoi(n-1,s,b,t)
        second=hanoi(1,s,t,b)
        third=hanoi(n-1,b,t,s)
        return first+second+third#####return times of 1
    ###print it on calling

对于范围内的 i (1,5):

    print 'New Hanoi Example: hanoi(',i,',source, target, buffer)'
    print '----------------------'
    print hanoi(i,'source','target','buffer')
于 2014-06-15T03:10:27.020 回答
0

您可以使用全局计数器来跟踪函数被调用的次数。

runcount = 0 

def Hanoi(n, src, dst, tmp):

    if n > 0:
        global runcount
        runcount += 1 
        Hanoi(n - 1, src, tmp, dst)
        print "Move disc", chr(64 + n), "From tower", src, "to tower", dst 
        Hanoi(n - 1, tmp, dst, src)

Hanoi(4,0,2,1) #Just an example

print runcount

最后打印 15。

于 2014-02-19T09:41:56.330 回答