2013-04-15 2 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

потому что result является mutable список. проще говоря, если вы добавляете элементы в список, элемент все еще присутствует, если только список или элемент не собраны в мусор. в вашем коде result указывает на тот же объект списка, который объявлен как аргумент по умолчанию функции permutation. вы не создаете новый список для result при каждом вызове функции permutation. Поскольку вы нажимаете/поменяете элемент (ы) для каждой перестановки, вы можете подумать (и это похоже), что ваша функция «неактивна», но это не так.

Смежные вопросы