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