Статья Автор: Деникина Н.В., Деникин А.В.

Явный возврат - работа со списком

Иногда удобнее хранить решение в списке. Тогда нужен явный возврат:

АЛГОРИТМ Поиск(решение, осталось)

    // Базовый случай: сумма достигнута
    ЕСЛИ осталось = 0 ТО
        ВЫВЕСТИ решение          // выводим решение
        ВЫЙТИ ИЗ АЛГОРИТМА
    КОНЕЦ ЕСЛИ
    
    // Отсечение: сумма превысила цель
    ЕСЛИ осталось < 0 ТО
        ВЫЙТИ ИЗ АЛГОРИТМА
    КОНЕЦ ЕСЛИ
    
    // Перебираем цифры
    ДЛЯ КАЖДОЙ цифры ИЗ [1, 2, 3] ВЫПОЛНЯТЬ
    
        ДОБАВИТЬ цифру В КОНЕЦ решение    // шаг вперёд
        
        Поиск(решение, осталось - цифра)  // рекурсия
        
        УДАЛИТЬ ПОСЛЕДНИЙ ЭЛЕМЕНТ ИЗ решение  // ВОЗВРАТ
        
    КОНЕЦ ЦИКЛА

КОНЕЦ АЛГОРИТМА

// Запуск: начинаем с пустого списка
Поиск([], 3)

Ключевые действия:

  • ДОБАВИТЬ В КОНЕЦ — добавляем элемент, идём глубже по ветке
  • УДАЛИТЬ ПОСЛЕДНИЙ — убираем элемент, возвращаемся назад
Почему нужно удалять?
Список — один на всех! Если не убрать цифру, она останется для следующих вариантов.
Печать