【发布时间】:2019-01-03 09:32:12
【问题描述】:
程序应该做的是采取步骤和一个数字,然后输出你有多少个独特的序列,恰好是 x steps 来创建 number。
有人知道我可以如何节省一些内存吗?因为我应该在 4 秒的限制内处理大量数据。
def IsaacRule(steps, number):
if number in IsaacRule.numbers:
return 0
else:
IsaacRule.numbers.add(number)
if steps == 0:
return 1
counter = 0
if ((number - 1) / 3) % 2 == 1:
counter += IsaacRule(steps-1, (number - 1) / 3)
if (number * 2) % 2 == 0:
counter += IsaacRule(steps-1, number*2)
return counter
IsaacRule.numbers = set()
print(IsaacRule(6, 2))
如果有人知道带有记忆功能的版本,我将不胜感激,现在它可以工作,但仍有改进的空间。
【问题讨论】:
-
您可以使用记忆缓存加快速度,例如
functools.lru_cache。不过,这将使用 more 内存。而且它并没有节省很多递归调用。例如,IsaacRule(40, 1)我得到了 66588 的计数和这些缓存统计信息:CacheInfo(hits=6057, misses=48335, maxsize=None, currsize=48335)。但我想 12% 左右的缓存命中总比没有好。 -
顺便说一句,您应该为此使用楼层除法运算符
//。在 Python 2 中使用/不会有什么坏处,但在 Python 3 中会有所不同。 -
我刚刚注意到您的第二个
if是多余的:(number * 2) % 2 == 0对于任何整数都是正确的。但我没有仔细分析你的代码逻辑。你确定它在做正确的事吗? -
哈哈很好,谢谢 PM 2Ring - 如果已经为
-
我们需要在条件检查中使用浮点除法。例如,23 不能由 3n+1 规则生成,而是
((23 - 1) // 3) % 2 == 1。或者,此条件应替换为number % 6 == 4