Все темы
59

Все комбинации «включено-выключено» для списка

Tier 1Закрыто

Где применяется

1. Задача

В прошлых уроках рекурсия считала один ответ: размер папки, число Фибоначчи. Бэктрекинг (поиск с возвратом) теми же вызовами функции самой себя обходит все пути и собирает ответ на каждом. На каждом шаге он пробует вариант, идёт глубже, потом отменяет этот выбор и пробует следующий. Новая идея здесь одна: эта отмена, то есть возврат всего к прежнему состоянию перед новой попыткой.

Ты выпускаешь релиз с тремя фичефлагами (переключателями, которые включают и выключают функции программы). Перед выходом CI (система, которая автоматически проверяет код) должен проверить релиз при каждой комбинации флагов: все выключены, включён только первый, включены первый и третий, включены все и так далее. Тебе нужен полный список комбинаций «включено-выключено».

Для трёх флагов комбинаций 8. Для десяти флагов их 1024. Выписывать их руками нереально. Вложенные циклы тоже не подходят: число флагов меняется, и для каждого количества понадобилась бы своя глубина вложенности.

Нужна функция, которая идёт по списку и на каждом элементе пробует оба ответа: оставить элемент снаружи или положить внутрь. Каждый путь от начала до конца даёт одну комбинацию.

Этот шаг из платной части

Бесплатные шаги в начале курса (их 33) открыты всем: урок, задача и тесты. Этот шаг открывается с полным доступом. Начни с бесплатного аккаунта и бесплатных шагов.

Завести бесплатный аккаунтПосмотреть, что входит
Перебор всех последовательностей: выбрать, исследовать, отменить
backtrack([], [1, 2], [])
choices
1
2
path (сделанные выборы)
пусто
result
пусто
path.length = 0

Перечисляем все последовательности длины 2 из [1, 2]. Цикл предлагает каждый вариант на каждом уровне, поэтому значения могут повторяться.

Как узнать

Бэктрекинг (Backtracking)

Эти слова в условии значат этот паттерн

  • сгенерировать все подмножества/перестановки/комбинации
  • n маленькое (примерно n <= 12-20), экспоненциальный перебор допустим
  • сделать выбор, уйти в рекурсию, затем отменить выбор перед следующим
  • расставить элементы с ограничениями и откатиться при конфликте (N ферзей, судоку)
  • вернуть все допустимые варианты, а не один

Похоже, но не то

Ответ растёт экспоненциально, поэтому n маленькое. Подмножеств из 20 элементов 1e6, перестановок из 10 около 3.6e6.

На LeetCode

Задачи, где нужно перечислить все подмножества или все сочетания выборов, по одному выбору на элемент. На каждом элементе ветвись, уходи в рекурсию и отменяй выбор перед следующей веткой.

Мы используем необходимые куки для работы сайта (вход и язык). Если ты согласишься, мы также загрузим Google Analytics, чтобы видеть, какие страницы читают, и Google reCAPTCHA для защиты форм обратной связи и сообщений об ошибке от спама. Политика конфиденциальности