我对理解此代码有疑问。
代码:
def hanoi(n, A, B, C) :
' ' ' n - number of discs
A - initial stick
B - Middle stick
C - Goal stick ' ' '
if n > 0:
hanoi(n - 1, A, C, B)
print('Disc', n, 'from', A, 'to', C)
hanoi(n - 1, B, A, C)
hanoi(3, 'A', 'B', 'C')
当我使用调试器时,我会在if循环中看到,控制流首先检查if条件,然后在hanoi(n - 1, A, C, B)
中将其关闭,并在第一次执行该条件时再次执行该操作更多次,而不是继续进行print('disc', n, 'from', A, 'on', C)
。我不知道为什么要这么做,以及它使用什么样的规则。我在空闲环境下工作。
这是编译程序的结果:
Disc 1 from A on C
Disc 2 from A to B
Disc 1 from C to B
Disc 3 form A to C
Disc 1 from B to A
Disc 2 from B to C
Disc 1 from A to C
答案 0 :(得分:0)
这是因为
hanoi(n - 1, A, C, B)
#is before
print(...)
因此它将在打印每个子孩子之前先进行堆叠
将这两行切换为
print('Disc', n, 'from', A, 'to', C)
hanoi(n - 1, A, C, B)
hanoi(n - 1, B, A, C)
代码正常工作:)
答案 1 :(得分:0)
您必须了解沿着诸如hanoi(n - 1, A, C, B)
之类的分支的代码流的含义。该语句在print语句之前,并且在较低的堆栈中对该函数进行递归调用。必须先对较低的堆栈 进行评估,然后才能继续执行print语句。
这里的问题是,您可能会发现很难在简单的IDE中可视化“较低的堆栈”和递归。这是相同的pythontutor可视化。 link
但最底线是:print
语句之所以不能执行,仅仅是因为控制流/代码流从未遇到过print
语句,并且由于递归调用而分支到了较低的堆栈。 print
恰好在应有的时间发生,因为这就是代码的编写方式。