Explain this Towers of Hanoi solution (written in python)
我正试图了解河内塔问题的这一特定解决方案。这是一个递归解决方案。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | A = [5, 4, 3, 2, 1] B = [] C = [] def move(n, source, target, auxiliary, frm): print('n here : ', n) if n > 0: print('frm : ', frm, n) # move n - 1 disks from source to auxiliary, so they are out of the way move(n - 1, source, auxiliary, target, '1') # move the nth disk from source to target target.append(source.pop()) print('n:', n) # Display our progress print(source, target, auxiliary, '##############', sep = '\ ') # move the n - 1 disks that we left on auxiliary onto target move(n - 1, auxiliary, target, source, '2') # initiate call from source A to target C with auxiliary B move(5, A, C, B, '0') |
您可以在此处看到它
https://repl.it/JUzY/0
打印#########的第一行后,n = 0的值变为2。这是怎么发生的?我是否错过了一些递归概念?帮助我理解这一点。
您需要了解范围。您说" n = 0的值,但突然变成2"。但是有一个以上的" n",因为n的范围是方法。每次调用
在脚本的底部,调用
了解递归工作原理的一个好方法是使用纸手工完成程序执行。我将使用便利贴来进行函数调用,并使用笔记本来进行输出。您还会以列表
以开头的
1 2 3 4 5 | n = 4 source = A target = C auxiliary = B frm = '0' |
现在按照
当您到达 将其放在上一个帖子的顶部。在重新显示之前,不允许您查看掩盖的便利贴。继续这样做,最终将得到一叠五个便笺纸。 第五个便利贴具有 您记下了您所在的行号,因此请从该行手动执行代码。您将产生一些输出,然后再次调用 如果继续这样做,您会看到纸叠多次收缩和收缩,您将到达原始纸浆一次,进行打印,然后再次增大纸叠,然后再次到达原始纸浆,最后完成。 便利贴堆栈是程序运行时执行堆栈的精确模型。当您看到堆栈跟踪(甚至是非递归程序)时,它们就是它们的代表。每个便利贴都是一个堆栈框架,局部变量的作用域仅限于该堆栈框架。 河内的递归解决方案可以用英语表示:
2
3
4
5
source = A
target = B (caller's auxiliary)
auxiliary = C (caller's target)
frm = '1'
-
首先将n-1个光盘从src移到辅助光盘(以使其摆脱干扰)
- 以与我们执行此操作相同的方式进行操作。
- 然后将显示的光盘移到目标位置
-
然后使用src作为备用钉将n-1个光盘从辅助光盘移动到目标光盘
- 以与我们执行此操作相同的方式进行操作