我已经尝试过这段代码,但它不起作用,结果为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:
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.
答案 0 :(得分:1)
您的代码包含" off-by-one错误"。您的循环由range(2,n,1)
控制,即从2
到n-1
的数字,包括{,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)
或者,这是另一种解决方案:
struct BBox {
xmin:float;
xmax:float;
ymin:float;
ymax:float;
}
table msg {
key:string;
boxes: [BBox];
}
root_type Message;
答案 1 :(得分:-2)
试试这个。
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)