河内塔,理解代码有问题

时间:2019-08-23 06:33:58

标签: python

我对理解此代码有疑问。

代码:

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

2 个答案:

答案 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恰好在应有的时间发生,因为这就是代码的编写方式。