一个Python的最少步骤
我已尝试此代码,但它不起作用,结果为0。我知道递归的方法,但我正在尝试使用for循环来实现它一个Python的最少步骤,python,for-loop,minimum,Python,For Loop,Minimum,我已尝试此代码,但它不起作用,结果为0。我知道递归的方法,但我正在尝试使用for循环来实现它 def minsteps(n): memo =[0]*(n+1) memo[0] = 0 memo[1] = 0 for i in range(2,n,1): r = 1+memo[i-1] if i%2 == 0: r = min(r, 1+memo[i//2]) elif i%3 == 0:
def minsteps(n):
memo =[0]*(n+1)
memo[0] = 0
memo[1] = 0
for i in range(2,n,1):
r = 1+memo[i-1]
if i%2 == 0:
r = min(r, 1+memo[i//2])
elif i%3 == 0:
r = min(r, 1+memo[i//3])
memo[i] = r
return memo[n]
这段代码是为了提供一个最小的步骤,要求某些数字为1,并经历负1、除2和除3的过程。
例如:
6->2->1 [3]
或
6->3->1 [3]
或
6->5->4->2->4[5]
因此,最小步骤为3。您的代码包含一个off by one错误。您的循环由范围2,n,1控制,即从2到n-1(包括)的数字,因此您可以初始化列表值memo[2]到memo[n-1(包括)。但是您从memo[n]返回结果,它仍然具有初始值0 您可以使用以下for语句修复该错误:
for i in range(2,n+1,1):
或者,这里有另一个解决方案:
import collections
def minsteps(n):
memo = collections.defaultdict(lambda: n+1)
memo[1] = 0
for i in range(1, n+1):
memo[i+1] = min(memo[i+1], memo[i]+1)
memo[i*2] = min(memo[i*2], memo[i]+1)
memo[i*3] = min(memo[i*3], memo[i]+1)
return memo[n]
for i in range(10):
print i, minsteps(i)
试试这个
def minsteps1(n):
memo = [0]*(n+1)
def loop(n):
if n>1:
if memo[n]!=0:
return memo[n]
else:
memo[n] = 1 + loop(n-1)
if n%2 == 0:
memo[n] = min(memo[n], 1+loop(n//2))
if n%3 == 0:
memo[n] = min(memo[n], 1+loop(n//3))
return memo[n]
else:
return 0
return loop(n)
你能解释一下你的代码应该做什么吗。提供示例输入和预期输出。如果您能提供您认为问题所在的任何见解,这也会有所帮助。也值得您花时间阅读。我不确定您的函数做什么或应该做什么,但可以肯定的是,由于范围2,n,1,您将项目修改为n-1,这是范围的最后一个元素,而您在结尾处使用memo[n]。也就是说,使用range2,n+1?脚本中还缺少打印命令,即写入中间信息。