2016-04-19 51 views
1

我是Python的新手,所以也許它可能是一個愚蠢的問題。遞歸函數不返回創建的字符串

我已經實現了一個簡單的遞歸揹包解決方案,最終返回一個位序列。但有時它不會返回生成的序列。這是我的代碼及其對不同輸入的結果。

def knapsackRecursive(items, maxNum, bestResponse): 
    print('items=' + str(items) + ', maxNum=' + str(maxNum)) 
    referenceIndex = 0 
    editableMaxNum = maxNum 
    if editableMaxNum == 0: 
     bestResponse = '0' 
    else: 
     for i in reversed(items): 
      item = int(i) 
      if editableMaxNum >= item: 
       if referenceIndex == 0: 
        referenceIndex = items.index(str(item)) 
       editableMaxNum -= item 
       bestResponse = '1' + bestResponse 
      else: 
       bestResponse = '0' + bestResponse 
     if editableMaxNum != 0: 
      bestResponse = '' 
      if referenceIndex != 0: 
       for k in range(0, len(items) - referenceIndex): 
        bestResponse = '0' + bestResponse 

       knapsackRecursive(items[:referenceIndex], maxNum, bestResponse) 
      else: 
       bestResponse = '0' 

    print('bestResponse=' + str(bestResponse)) 
    return bestResponse 

Items是其是常數[ '1', '2', '4', '10', '20', '40', '63', '105'。最初bestResponse是空字符串。

如果我設置maxNum如41,輸出爲:

items=['1', '2', '4', '10', '20', '40', '63', '105'], maxNum=41 
bestResponse=10000100 

但是,如果我設置maxNum如71,輸出爲:

items=['1', '2', '4', '10', '20', '40', '63', '105'], maxNum=71 
items=['1', '2', '4', '10', '20', '40'], maxNum=71 
bestResponse=10011100 
bestResponse=00 

爲什麼打印兩次輸入71 bestResponse輸出?儘管第一次打印是正確的,但爲什麼函數返回錯誤的第二個結果呢?

編輯

我已經改變了knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)return knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)。它似乎解決了。很明顯,我在使用遞歸時犯了一個錯誤。但我仍然不明白,爲什麼函數返回第一次調用的結果,而不是第二次調用,而第二次調用預計會產生正確的響應。

回答

1

我認爲你應該做的:

best_response = knapsackRecursive(items[:referenceIndex], maxNum, bestResponse) 

,而不是

knapsackRecursive(items[:referenceIndex], maxNum, bestResponse)