Есть ли способ рекурсивного вызова множественного и переменного числа ветвей функции без получения вложенных значений? - PullRequest
0 голосов
/ 14 апреля 2020

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

Чтобы рекурсивно вызвать переменное число функций, я В словаре хранятся все функции, которые я хочу вызывать каждый раз, а затем я выполняю вызов всех значений, хранящихся в нем. Проблема в том, что полученные результаты вложены в список для каждого вызова значений словаря.

Есть ли способ рекурсивного вызова множественного и переменного числа ветвей функции без получения вложенных значений?

Это код:

def permutations(lista, n=0, per = ''):

    f_dict = {}

    if n != len(lista):
        for i in range(len(lista)):
            if str(i) not in per:
                f_dict.update({i : permutations(lista, n+1 , per + str(i))})  
        call = [f_dict[i] for i in f_dict]
        return call
    return per

digits = [1,2,3]
print(permutations(digits))

Он печатает следующий список:

[[['012'] , ['021']], [['102'], ['120']], [['201'], ['210']]]

Но я хочу это в форма:

['012', '021', '102', '120', '201', '210']

Это мой первый время использования stackoverflow, дайте мне знать, если вам нужна дополнительная информация, или я не совсем понял с вопросом

Заранее спасибо за помощь !!

PD Я знаю, что могу создать список перестановки с помощью модуля itertools или выравнивание списка с помощью другой функции, но это не является целью этого вопроса.

1 Ответ

0 голосов
/ 14 апреля 2020

Вы можете исправить свой подход следующим образом:

def permutations(lista, n=0, per = ''):
    f_dict = {}
    if n != len(lista):
        for i in range(len(lista)):
            if str(i) not in per:
                f_dict[i] = permutations(lista, n+1 , per + str(i))
        return [x for v in f_dict.values() for x in v]  # unpack and chain the lists
    return [per]  # return a singleton list of strings

>>> print(permutations([1, 2, 3]))
['012', '021', '102', '120', '201', '210']

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

Кстати, содержимое передаваемого вами списка никогда не используется. Вы можете просто передать саму длину:

>>> print(permutations([6,5,4]))
['012', '021', '102', '120', '201', '210']

Каноническая рекурсивная реализация через рекурсивный генератор будет выглядеть так:

def permutations(lst):
    if lst:
        for i, x in enumerate(lst):
            for perm in permutations(lst[:i] + lst[i+1:]):
                yield [x] + perm
    else:
        yield []

>>> list(permutations([6,5,4]))
[[6, 5, 4], [6, 4, 5], [5, 6, 4], [5, 4, 6], [4, 6, 5], [4, 5, 6]]
...