2013-04-15 132 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建立新的列表。因爲你爲每個排列推動/彈出項目,你可能會認爲(看起來)你的函數是'無狀態的',但事實並非如此。