Для пошаговой генерации перестановок в Python используется рекурсивная функция с ключевым словом yield, которая выдает новую комбинацию на каждом шаге, не сохраняя все варианты в памяти.
Код генератора перестановок
Пошаговый разбор работы (на примере [1, 2, 3])
Когда вы вызываете функцию и запрашиваете элементы через
next(), выполнение происходит по следующему алгоритму:- Фиксация первого элемента (
i = 0):currentстановится1.remaining(остаток) равен[2, 3].- Функция рекурсивно уходит в
permutations([2, 3]).
- Шаг внутри рекурсии для
[2, 3]:- Берется
2. Остаток[3]. Длина остатка равна 1 — срабатывает базовый случай (yield [3]). - К
2прибавляется[3]. Получаем[2, 3]. - Возвращаемся на верхний уровень, склеиваем с
1:yield [1, 2, 3](Код засыпает).
- Берется
- Следующий шаг (
next()):- Код просыпается внутри
permutations([2, 3]). Цикл переходит кi = 1. - Берется
3. Остаток[2]. Базовый случай дает[2]. - Склеиваем:
3 + [2] = [3, 2]. - На верхнем уровне склеиваем с
1:yield [1, 3, 2](Код засыпает).
- Код просыпается внутри
- Смена главного элемента (
i = 1на верхнем уровне):- Главный цикл функции
permutations([1, 2, 3])смещается. Теперьcurrentравен2. remainingравен[1, 3]. Процесс повторяется, выдавая[2, 1, 3], а затем[2, 3, 1].
- Главный цикл функции
- Последний элемент (
i = 2на верхнем уровне):currentравен3,remainingравен[1, 2]. Генерируются варианты[3, 1, 2]и[3, 2, 1].
Как запустить генератор пошагово
Вы можете получать элементы вручную с помощью встроенной функции
next(), что наглядно демонстрирует "замораживание" состояния:Альтернатива из стандартной библиотеки
Если вам нужен готовый инструмент для рабочих задач, используйте функцию
permutations из встроенного модуля itertools — она также работает как эффективный пошаговый генератор:Если вам интересно, напишите: хотим ли мы добавить в этот код обработку дубликатов (например, для списка
[1, 1, 2]) или вам нужно визуализировать дерево рекурсии для этого алгоритма?
Комментариев нет:
Отправить комментарий