【发布时间】:2021-11-14 22:03:33
【问题描述】:
我尝试使用动态和递归方法解决原始计算器问题,对于较小的输入效果很好,但对于较大的输入需要很长时间(例如:96234)。
给你一个原始计算器,它可以执行以下三个操作 当前数字????:乘????乘以 2,乘 ???? 3,或加 1 到????。你的目标是 正整数??? 从数字 1 开始。
import sys
def optimal_sequence(n,memo={}):
if n in memo:
return memo[n]
if (n==1):
return 0
c1 = 1+optimal_sequence(n-1,memo)
c2 = float('inf')
if n % 2 == 0 :
c2 = 1+optimal_sequence(n // 2,memo)
c3 = float('inf')
if n % 3 == 0 :
c3 = 1+optimal_sequence(n // 3,memo)
c = min(c1,c2,c3)
memo[n] = c
return c
input = sys.stdin.read()
n = int(input)
sequence = optimal_sequence(n)
print(sequence) # Only printing optimal no. of operations
任何人都可以指出递归解决方案中的问题,因为它可以通过使用 for 循环正常工作。
【问题讨论】:
-
你说它适用于小数字。您遇到大数字的错误是什么?
-
需要很长时间
-
@Ben10101 如果代码可以运行,但您需要优化它(正如您所说,运行时间很长),这篇文章不是针对 StackOverflow,而是针对 CodeReview:codereview.stackexchange.com
-
这是一种误导:一个需要很长时间的进程不一定有错误。当输出错误时,您可以假设一个错误。
-
这不是错误,而是递归编程的本质。您可以对其进行优化,但随后该问题将再次出现在更高的数字上。这是某种家庭作业吗?那么递归在高调用上会花费很长时间这一事实将是您可以在这里学到的一课
标签: python recursion dynamic-programming