Python3 рекурсивно, for-l oop, функция возвращает странный вывод - PullRequest
1 голос
/ 05 марта 2020

Моя функция combinations(ary, p) предназначена для return каждой возможной комбинации порядка элементов в списке. Но он всегда возвращает первое значение несколько раз, даже если он находит все возможные заказы, которые я знаю, потому что он их печатает.
РЕДАКТИРОВАТЬ: Я хотел бы заставить его работать сам, учиться чему-то и не использовать какие-либо внешние библиотеки.

def combinations(ary, p):
    ln = len(ary)
    bary=[]
    for a in range(ln-p):
        if p<ln-2:
            bb = combinations(ary, p+1)
            for be in bb:
                bary.append(be)
        if p>=ln-2:
            bary.append(ary)
        ary.append(ary.pop(p))
    return bary


Другая версия с функциями отладки print (). Я дам свой пример вывода.

def combinations(ary, p):
    ln = len(ary)
    bary=[]
    for a in range(ln-p):
        if p<ln-2:
            bb = combinations(ary, p+1)
            for be in bb:
                bary.append(be)
        if p>=ln-2:

    -->     bary.append(ary)
    -->     print('ary', ary, 'bary', bary)

        ary.append(ary.pop(p))
    return bary

Вывод на консоль после запуска с combinations([7,3,2], 0)::

##  There is clearly every possible combination:
##
##      ||
##      ||
        \/
ary [7, 3, 2] bary [[7, 3, 2]]
ary [7, 2, 3] bary [[7, 2, 3], [7, 2, 3]]
ary [3, 2, 7] bary [[3, 2, 7]]
ary [3, 7, 2] bary [[3, 7, 2], [3, 7, 2]]
ary [2, 7, 3] bary [[2, 7, 3]]
ary [2, 3, 7] bary [[2, 3, 7], [2, 3, 7]]
[[7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2], [7, 3, 2]]


Последний список включает все возможные ордера, но содержит только вход Значение порядка, даже если он печатает каждый заказ. Так, где я испортил return?

1 Ответ

1 голос
/ 05 марта 2020

Ваша проблема в том, что есть только одна копия ary. Вы добавляете это к Бари много раз. Так что Бэри полон одного и того же списка. Каждый раз, когда вы вносите изменения в Ary. Это будет отражено во всех них, потому что все они - один и тот же список.

Вместо этого, когда вы добавляете к bary, назначаете копию ary, но как новый собственный список, так что это не повлияет на изменение ary.

def combinations(ary, p):
    ln = len(ary)
    bary=[]
    for a in range(ln-p):
        if p<ln-2:
            bb = combinations(ary, p+1)
            for be in bb:
                bary.append(be)
        if p>=ln-2:
            bary.append(ary[:]) #Changed this line to take a shallow copy of ary
            print('ary', ary, 'bary', bary)

        ary.append(ary.pop(p))
    return bary

print(combinations([7,3,2], 0))

ВЫХОД

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