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 が変化し、それを修正する方法がわかりません。

編集:

明確にするために、次のように歩数を買い物させたい: (If I call 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 に答える
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

範囲 (1,5) の i の場合:

    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 に答える