Powerset рекурсивный, список понимания Python3

Я новичок в Python3 и пытаюсь сделать рекурсивную функцию powerset. Следует использовать понимание списка.

Я написал:

def powerset(seq):
    if not seq:
       return [[]]
    return powerset(seq[1:]) + [[seq[0]] + n for n in powerset(seq[1:])]

Эта функция работает, но я получил отзыв, и мне сказали, что нет необходимости вызывать функцию два раза. Это сделало много вычислений. Он должен легко рассчитывать до 20 блоков питания. Так как мне быть? Я не могу заставить его работать без вызова функции дважды. Благодарю.

1 ответ

Просто посчитай powerset(seq[1:]) сохраните его в переменной и используйте дважды:

def powerset(seq):
    if not seq:
        return [[]]
    ps = powerset(seq[1:])
    return ps + [[seq[0]] + n for n in ps]

Разница в том, что таким образом вы используете ps дважды, но вы вычисляете это только один раз.


В качестве альтернативы, вы можете использовать двойное понимание списка (если вам нравится такая вещь...)

def powerset(seq):
    return [x for ps in powerset(seq[1:]) for x in ([seq[0]] + ps, ps)] if seq else [[]]

Здесь та же временная переменная ps определяется внутри понимания списка. Однако обратите внимание, что таким образом результаты будут в несколько ином порядке.


Я чувствую себя очень неясно. Я на самом деле не понимаю, как просто присвоение переменной может изменить это? Это значит то же самое?

Кажется, вы слишком много думаете о чистой математике. В программировании y = f(x) не означает "y совпадает с / синонимичным для f(x)", но "присваивает результат f (x) y".

Другие вопросы по тегам