Вывод рекурсивной функции Python - PullRequest
0 голосов
/ 18 октября 2018

У меня проблема с функцией, которая должна возвращать все возможные комбинации в списке без повторения образца.

Функция работает отлично, но я не могу получить список всех комбинаций:

abc = ['a','b','c','d','e']

def combi(pre, listg, stage=1,first = 1):
    if len(listg)==0:
        return []
    start = first
    lifeat =[]
    for i in range(start,len(listg)):
        lifeat.append(pre + [listg[i]])
        print('stage: ',stage,'|| ',i,' ',pre + [listg[i]])
        diff = set(listg[i:]) - set(pre+[listg[i]])
        seted= [item for item in listg[i:] if item in diff]
        li = combi(pre+ [listg[i]],seted,stage+1, first= 0)
        #print('li : ',li)
    return lifeat+li


def all_combi(liste):
    return combi([liste[0]], liste)
all_combi(abc)

напечатанный результат: print('stage: ',stage,'|| ',i,' ',pre + [listg[i]])

stage:  1 ||  1   ['a', 'b']
stage:  2 ||  0   ['a', 'b', 'c']
stage:  3 ||  0   ['a', 'b', 'c', 'd']
stage:  4 ||  0   ['a', 'b', 'c', 'd', 'e']
stage:  3 ||  1   ['a', 'b', 'c', 'e']
stage:  2 ||  1   ['a', 'b', 'd']
stage:  3 ||  0   ['a', 'b', 'd', 'e']
stage:  2 ||  2   ['a', 'b', 'e']
stage:  1 ||  2   ['a', 'c']
stage:  2 ||  0   ['a', 'c', 'd']
stage:  3 ||  0   ['a', 'c', 'd', 'e']
stage:  2 ||  1   ['a', 'c', 'e']
stage:  1 ||  3   ['a', 'd']
stage:  2 ||  0   ['a', 'd', 'e']
stage:  1 ||  4   ['a', 'e']

Это вывод, который я получил: вывод

[['a', 'b'], ['a', 'c'], ['a', 'd'], ['a', 'e']]

Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 18 октября 2018

У вас есть несколько проблем в вашей логике.Я настоятельно рекомендую вам использовать инкрементное программирование для решения ваших трудностей.

  1. Вы принимаете первый элемент как обязательный элемент каждой комбинации.
  2. Вы добавляете только последнее значение li из вашей for петли;lifeat должен получить их все.

Для второй проблемы измените ваш оператор возврата на две строки:

    lifeat += li
return lifeat

Это улучшит ваш результат до

[['a', 'b'], ['a', 'b', 'c'], ['a', 'b', 'c', 'd'], ['a', 'b', 'c', 'd', 'e'],
 ['a', 'b', 'c', 'e'], ['a', 'b', 'd'], ['a', 'b', 'd', 'e'], ['a', 'b', 'e'],
 ['a', 'c'], ['a', 'c', 'd'], ['a', 'c', 'd', 'e'], ['a', 'c', 'e'], ['a', 'd'],
 ['a', 'd', 'e'], ['a', 'e']]

Я оставлю вам проблему инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...