【发布时间】:2020-04-07 23:31:01
【问题描述】:
我有以下代码。这就像我能做到的一样简单。有谁知道将这种递归变成循环的巧妙方法?
问题是我可能会遇到回避限制。我想了一些方法来重写它,但它们一点也不漂亮。
此时我最好的想法是我可以把它变成某种尾递归形式,但我不知道该怎么做。
def blackbox(c, i): #This is a different function in production
if i > 5:
return range(0,1)
else:
return range(0,c+i)
def recurse(c, length):
if length == 0:
return [[]]
return [l + [j] for j in blackbox(c, length) for l in recurse(c - j, length - 1)]
示例:recurse(6, 1000) 抛出的错误远远超出递归限制。
很酷,几乎没用的事实:将range(i, c + 1) 用于黑盒会返回所有长度为length 且总和最多为c 的列表。
编辑:我知道我可以记住代码,但这并不能解决递归限制。在这个例子中,记忆对速度有很大帮助,但在我的情况下它没有,所以我不关心它。
编辑 2:更新了 blackbox,因此 recurse(6,1000) 的值是合理的。
【问题讨论】: