2015-11-02 82 views
-3

我试过这段代码,但它不起作用,结果为0.我已经知道递归的一个,但我正在尝试使用for循环。最小步骤到一个Python

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

+6

请问你能解释一下你的代码应该做什么。提供样本输入和预期输出。如果您提供了有关您认为问题出在哪里的信息,也会有所帮助。值得你花时间阅读[this](http://stackoverflow.com/help/mcve)。 – idjaw

+3

我不确定你的函数做了什么(或者应该做什么),但是肯定由于范围(2,n,1),你修改了项目到'n-1'(这是范围的最后一个元素),而你最后拿着备忘录[n]'。即使用'range(2,n + 1)'? – freakish

+0

脚本中还缺少一件事是'print()'命令,编写中间信息。 – Dominique

回答

1

代码包含一个“错过的错误”。您的循环由range(2,n,1)控制,即从2n-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) 
+0

谢谢。现在我懂了。非常感谢。 –

-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)