一个Python的最少步骤

一个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:

我已尝试此代码,但它不起作用,结果为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。

您的代码包含一个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?脚本中还缺少打印命令,即写入中间信息。