【发布时间】:2021-11-05 16:49:52
【问题描述】:
我想为 Minesweepers/Cheess 创建 N 维板,当我使用 DP 提高速度时遇到了问题,但是两个版本之间的速度似乎相同。
版本 1:朴素递归
def createboard_nd(dimensions, value=None):
if len(dimensions) == 1:
return [value for _ in range(dimensions[0])]
else:
return [createboard_nd(dimensions[1:], value) for _ in range(dimensions[0])]
版本 2:使用 DP 进行递归
def createboard_nd(dimensions, value=None, memo=None):
if memo is None:
memo = {}
if len(dimensions) in memo:
return memo[len(dimensions)]
if len(dimensions) == 1:
memo[len(dimensions)] = [value for _ in range(dimensions[0])]
return memo[len(dimensions)]
else:
memo[len(dimensions)] = [createboard_nd(dimensions[1:],value, memo) for _ in range(dimensions[0])]
return memo[len(dimensions)]
示例
createboard_nd((10,10,10,10,10,10), 1)
【问题讨论】:
-
我已经更新了使用示例。大约花了同样的时间
-
奇数。在我的测试中,后者快了大约 3000 倍。您分别测量了多少时间?
-
(这并不重要,因为两者都在做根本不同的事情,而后者肯定不会做你想做的事。)
-
后面的代码你能说得更具体点吗?
-
好吧,您是故意重用相同的列表对象。当您将数据写入它们时,您打算如何处理?根据需要即时制作副本?听起来很复杂。
标签: python recursion dynamic-programming