一个Python

时间:2015-11-02 14:50:57

标签: 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:
            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.

2 个答案:

答案 0 :(得分:1)

您的代码包含" off-by-one错误"。您的循环由range(2,n,1)控制,即从2n-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)