2014-10-28 44 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])