关于汉诺塔的非递归 solution 的问题

2016-08-03 17:14:41 +08:00
 hptcyhj
def iterativeHanoi(n):
    def f(k): return (k%3) if (n%2==0) else (-k%3)
    return [(f(move & (move-1)),
             f((move|(move-1))+1)) for move in range(1,1 << n)]

输出结果(举例):[(0, 1), (0, 2), (1, 2), (0, 1), (2, 0), (2, 1), (0, 1)]

(0, 1) 表示把第 1 根柱子最上面的盘放到第 2 根上。

我的问题是:

1079 次点击
所在节点    问与答
2 条回复
SuperFashi
2016-08-03 17:29:19 +08:00
这叫状态压缩,将一种状态用某种进制表示是在数论或动规题的常用做法。
而汉诺塔这类数论题(包括博弈论中的 sg )为什么可以用二进制表示出来并用数学方法(例如且或异或等)进行运算,都是可以用数学证明的(大多是数学归纳法),至于证明方法请另行 wiki 。
Reficul
2016-08-04 01:52:06 +08:00
汉诺塔问题可以用具体数学里说到的,用归纳法直接求出结果公式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/296888

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX