2014-10-28 41 views
1

我需要創建一個函數來返回兩個列表。第一個是包含「found」和「dummy」的字符串列表,指示兩個列表中的數字相同的元素。第二個列表包含一定數量的整數,範圍由參數「顏色」給出,該參數返回找到某個數字的次數。目前我已經完成了第一個列表的任務,但第二個列表讓我很困惑。另外,您必須在流程中使用遞歸。這裏是到目前爲止的代碼如何在遞歸期間創建和編輯列表?

def find(code, guess, colors): 
    if guess == []: 
     return [] 
    else: 
     if guess[0] == code[0]: 
      return ["found"] + find(code[1:], guess[1:], colors) 
     else: 
      return ["dummy"] + find(code[1:], guess[1:], colors) 

一個可能的結果是這樣的:

>>> find([1,2,3],[3,2,1],6) 
[[’dummy’, ’found’, ’dummy’], [0, 0, 1, 0, 0, 0]] 
+3

能否請您解釋一下爲什麼'[0,0,1,0,0,0]'在你給'find'參數方面? – gboffi 2014-10-28 00:50:20

+0

@jacobieski如果您快樂地玩遞歸,我想推薦您Friedman&Felleisen的「The Little Schemer」。雖然不是Python書籍。 – gboffi 2014-10-28 01:03:10

+0

您的代碼顯然需要返回兩個列表,但所有三個'return'語句只返回一個列表。所以顯然你必須改變第一個像'return [],[]'的東西。對於第二種情況,您可能需要分兩步執行操作,比如'a,b = find(code [1:],guess [1:],colors)'' 「找到」] + a,[1] + b'。 (你可以這樣做,就像通過壓縮和解壓縮這兩個列表一樣,但這只是混淆了你的代碼,沒有很好的理由。) – abarnert 2014-10-28 01:09:14

回答

1

我會去這樣的事情:

def find(code, guess, colors): 
    def sub(code, guess, lst1, lst2): 
     if guess: 
      if guess[0] == code[0]: 
       lst2[code[0]] += 1 
       return sub(code[1:], guess[1:], lst1+["found"], lst2) 
      else: 
       return sub(code[1:], guess[1:], lst1+["dummy"], lst2) 
     else: 
      return lst1, lst2 
    return sub(code, guess, [], [0]*colors) 

然後

>>> print(find([1,2,3], [3,2,1], 6)) 
(['dummy', 'found', 'dummy'], [0, 0, 1, 0, 0, 0]) 
0
def find(code, guess, colors): 
    def wrapped_find(code, guess, color_list): 
     if guess == []: 
      return [] 
     else: 
      if guess[0] == code[0]: 
       color_list[code[0]]+=1 
       return ["found"] + wrapped_find(code[1:], guess[1:], color_list) 
      else: 
       return ["dummy"] + wrapped_find(code[1:], guess[1:], color_list) 

    color_list = [0]*colors 
    #the color list will be transmitted and modified each time a match is found. 
    match_list = wrapped_find(code, guess, color_list) 

    return match_list, color_list 

if __name__ == "__main__": 
    print(find([1,2,3,4],[3,2,1,4], 6)) 

結果是:

(['dummy', 'found', 'dummy', 'found'], [0, 0, 1, 0, 1, 0])