2015-11-02 78 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)