【发布时间】:2022-01-05 22:06:27
【问题描述】:
我有一个使用动态编程的问题的解决方案。我需要帮助将其从递归解决方案转变为迭代解决方案。
该函数接受一个数字并遵循三个规则:
- 它可以将数字分成两半
- 可以减一
- 可以加一个
直到数字为 1。我的目标是找到执行此操作所需的最少步骤数。
这是我的解决方案:
def solution(n):
n = int(n)
memo = {}
return memoized_fuel_injection_perfection(n, memo)
def memoized_fuel_injection_perfection(n, memo):
if n == 1:
return 0
if n == 2:
return 1
if n in memo:
return memo[n]
if n % 2 == 0:
if n not in memo:
memo[n] = memoized_fuel_injection_perfection(n//2, memo) + 1
return memo[n]
return min(memoized_fuel_injection_perfection(n-1, memo), memoized_fuel_injection_perfection(n+1, memo)) + 1
但是当我输入长度超过 300 位的数字时,我遇到了递归错误。我怎样才能把它变成一个迭代的解决方案?感谢您提供任何帮助或指导。
这是我创建的一个迭代解决方案,但我收到了带有非常大输入的 MemoryError。有什么方法可以优化存储变量,这样我就不必为每个数字计算它们?
def solution(n):
memo = {}
memo[0] = 0
memo[1] = 0
memo[2] = 1
n = int(n)
for i in range(3, n+1):
if i % 2 == 0:
memo[i] = memo[i//2] + 1
else:
memo[i] = min(memo[i//2], memo[i//2 + 1]) + 2
return memo[n]
【问题讨论】:
-
是 RecursionError 唯一的问题吗?即,如果我们可以让递归解决方案适用于大量输入,您对此满意吗?
-
是的,那行得通。虽然这是一个作业,但我不允许导入像 'sys' 这样的库来增加递归堆栈限制。
-
“大于 300 位的数字”您能否提供一个示例输入和预期输出?
-
使用
sys增加递归限制是愚蠢的。我们可以使用continuation-passing style 将任何递归程序转换为迭代程序。 -
打印(溶液( '10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003333000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003483983333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'))应该返回2467 跨度>
标签: python recursion iteration dynamic-programming