Hanoi Tower算法使用递归,同时显示步数

时间:2017-07-27 20:01:37

标签: algorithm towers-of-hanoi

我们都知道解决河内塔问题的python代码如下:

def hanoi(n, a, b, c):
    if n == 1:
        print a, '-->', c
        return
    hanoi(n-1, a, c, b)
    print a, '-->', c
    hanoi(n-1, b, a, c)

hanoi(4, 'A', 'B', 'C')

我的问题是在哪里添加print('stepCount ={}'.format(stepCount))以显示每个步骤的stepCount。

****更新&澄清***** 而上面代码的输出显示:

A > C
A > B
C > B
A > C
B > A
B > C
A > C

我想知道是否可以将print语句添加到代码中以将输出更改为:

stepCount: 1
A > C
stepCount: 2
A > B
stepCount: 3
C > B
stepCount: 4
A > C
stepCount: 5
B > A
stepCount: 6
B > C
stepCount: 7
A > C

2 个答案:

答案 0 :(得分:0)

当然,您可以更新此信息以打印步数。您可以向下传递一个额外的参数,在递归调用开始时跟踪步骤编号,然后在调用结束后让递归返回最后的步骤编号。有些事情要考虑:

  1. 您会使用什么初始值?
  2. 您如何从单个递归调用中捕获返回值?
  3. 您将如何处理捕获的值?

答案 1 :(得分:0)

@emplatetypedef描述了如下解决方案:

def hanoi(n, a, b, c, count):
    if n > 0:
        count = hanoi(n-1, a, c, b, count)
        count += 1
        print('stepCount: {}'.format(count))
        print('{} --> {}'.format(a, c))
        count = hanoi(n-1, b, a, c, count)
    return count

hanoi(3, 'A', 'B', 'C', 0)

它也可以用全局变量实现(是的,我知道......):

def hanoi(n, a, b, c):
    global stepCount
    if n > 0:
        hanoi(n-1, a, c, b)
        stepCount += 1
        print('stepCount: {}'.format(stepCount))
        print('{} --> {}'.format(a, c))
        hanoi(n-1, b, a, c)


stepCount = 0
hanoi(3, 'A', 'B', 'C')

OUTPUT (两个代码段)

stepCount: 1
A --> C
stepCount: 2
A --> B
stepCount: 3
C --> B
stepCount: 4
A --> C
stepCount: 5
B --> A
stepCount: 6
B --> C
stepCount: 7
A --> C