2011-01-15 2 views
0

Я преподаю Python. Я видел генератор перестановки java из строки, и я решил, что я использую версию java и сам пишу версию Python.Изучение Python - Ошибка перестановки

Вот что я писал в Python:

a = "abc" 
a = list(a) 

def swap(i,j): 
    c = a[i] 
    a[i] = a[j] 
    a[j] = c 

def perm2(n): 
    if n == 1: 
     print a 

    else: 
     for i in range(len(a)): 
      swap(i, n-1) 
      perm2(n-1) 
      swap(i, n-1) 

perm2(len(a)) 

Когда я запускаю это, я получаю следующее:

['b', 'c', 'a'] 
['c', 'b', 'a'] 
['c', 'a', 'b'] 
['c', 'a', 'b'] 
['a', 'c', 'b'] 
['a', 'b', 'c'] 
['b', 'a', 'c'] 
['a', 'b', 'c'] 
['a', 'c', 'b'] 

Теперь, выход действительно содержит все перестановки, но она также содержит дубликаты. Тем не менее, в версии java нет.

В чем причина этой проблемы?

Редактировать

Кстати, я знаю, что я мог бы исследовать и найти инструменты, чтобы сделать это для меня в одной строке, и т.д ... но моя цель состоит в том, чтобы понять причину этой проблемы, так что ответ, надеюсь, поможет мне в будущем. Основное понимание важно для меня.

+0

Вы знаете, что вы можете использовать 'itertools. перестановки' для этого ... – Debilski

+0

вот более питонистический своп: 'a [i], a [j] = a [j], a [i]' –

+1

Да, но я бы l чтобы понять суть языка, а не слепо использовать уже существующие инструменты. Попытка узнать здесь, не разрабатывать программное обеспечение (пока) - спасибо, хотя я буду помнить об этом :) – Sev

ответ

4

Изменение LEN (а) с п:

def perm2(n): 
    if n == 1: 
     print a 
    else: 
     for i in range(n): # << here 
      swap(i, n-1) 
      perm2(n-1) 
      swap(i, n-1) 

Результат:

['b', 'c', 'a'] 
['c', 'b', 'a'] 
['c', 'a', 'b'] 
['a', 'c', 'b'] 
['b', 'a', 'c'] 
['a', 'b', 'c'] 
+0

аххх там мы идем! глупая ошибка с моей стороны. благодаря! – Sev

+0

@Sev: нет проблем, рад, что это поможет :) – mouad

1

Я предлагаю вам с помощью itertools

>>> import itertools 
>>> for perm in itertools.permutations("abc"): 
    print perm 


('a', 'b', 'c') 
('a', 'c', 'b') 
('b', 'a', 'c') 
('b', 'c', 'a') 
('c', 'a', 'b') 
('c', 'b', 'a') 
+0

-1: ОП четко заявил, что он пытается выучить язык. –

+0

Извините, но, думаю, он отредактировал свой вопрос после того, как я отправил ответ. –

+0

Хотя это было не очень четко указано в вопросе, это было в комментариях, задолго до того, как вы отправили :) в любом случае, спасибо за помощь! – Sev

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