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

Перебор с возвратом (backtraking)

Главный вопрос: как после "111" программа переходит к "112"?

Ключевая идея: Цикл НЕ исчезает, когда мы уходим в рекурсию! Он ждёт. Когда рекурсия вернётся, цикл продолжится со следующей цифры.

Шаг 1: СоставьЧисла("", 3)
       Цикл: цифра = 1
       Запоминаем: "потом попробую 2 и 3"
       Вызываем: СоставьЧисла("1", 2)
       
Шаг 2:    СоставьЧисла("1", 2)
          Цикл: цифра = 1
          Вызываем: СоставьЧисла("11", 1)
          
Шаг 3:       СоставьЧисла("11", 1)
             Цикл: цифра = 1
             Вызываем: СоставьЧисла("111", 0)
             
Шаг 4:          СоставьЧисла("111", 0)
                сколько_осталось = 0 → ВЫВОДИМ "111"
                ВЫХОДИМ
                
Шаг 5:       Вернулись в СоставьЧисла("11", 1)
             Цикл продолжается: цифра = 2
             Вызываем: СоставьЧисла("112", 0)
             
Шаг 6:          ВЫВОДИМ "112", ВЫХОДИМ
             
Шаг 7:       Цикл продолжается: цифра = 3
             → ВЫВОДИМ "113"
             
Шаг 8:       Цикл закончился → ВЫХОДИМ
             
Шаг 9:    Вернулись в СоставьЧисла("1", 2)
          Цикл продолжается: цифра = 2
          → переходим к "12..." → "121", "122", "123"
Запомни: Возврат происходит автоматически, когда функция заканчивается. Цикл «вспоминает», где остановился, и продолжает работу.
Печать