2013-04-15 133 views
1
def permutation(li,result=[]): 
    print(li, result)    # I added this print statement as a diagnostic. 
    if li == [] or li == None:  # As coded, I expected each recursive call to 
     return      # reinitialize 'result=[]' because there is no 
            # second argument being passed in the recursive 
    if len(li) == 1:    # call below. 
     result.append(li[0]) 
     print(''.join(result)) 
     result.pop() 
     return 

    for i in range(0,len(li)): 
     result.append(li[i]) 
     permutation(li[:i] + li[i+1:])   # I would have thought that the 
     #permutation(li[:i] + li[i+1:], result) # recursive call needed to be this. 
     result.pop()   

test=list('123') 
permutation(test) 

结果:为什么这个递归码工作?

['1', '2', '3'] [] 
['2', '3'] ['1'] 
['3'] ['1', '2'] 
123 
['2'] ['1', '3'] 
132 
['1', '3'] ['2'] 
['3'] ['2', '1'] 
213 
+0

使用默认参数时的关键是,默认值在每次不构建新参数时引用相同的列表。由于列表是可变的,该列表与呼叫呼叫不一样。 – cmd

回答

1

因为resultmutable列表。简单地说,如果您将项目附加到列表中,则项目仍然存在,除非列表或项目被垃圾收集。在您的代码中,result指向声明为默认参数permutation函数的相同列表对象。在每次调用permutation函数时,您都不会为result建立新的列表。因为你为每个排列推动/弹出项目,你可能会认为(看起来)你的函数是'无状态的',但事实并非如此。