Часто на собеседованиях на младшие позиции компании хотят проверить, как у вас с нестандартным мышлением и решениями в условиях ограничений. Проще говоря — как вы ведёте себя в необычных ситуациях.
Пример такой задачи:
👉 Представьте, что в вашем языке программирования пропали все циклы. Как вы организуете в этом случае три классических цикла: for, while и until? Можно на примере Python или любого другого языка.
Чтобы решить эту задачу, нужно вспомнить, что цикл — это повторение одного и того же несколько раз. Сколько именно раз — зависит от вида цикла.
В каждом цикле есть два важных параметра:
- Переменная цикла, которая должна как-то меняться в процессе.
 - Условие цикла, по которому этот цикл закончится.
 
Получается, что в нашем решении обязательно должны быть эти два компонента, чтобы сымитировать работу цикла. Запомним это и подумаем дальше.
Раз нам нельзя использовать циклы, то попробуем сделать так:
- Выполняем нужные команды.
 - Проверяем условия и смотрим, нужно остановиться или продолжаем дальше.
 - Если продолжаем — снова выполняем нужные команды
 
Но как нам выполнить команды снова, если мы не знаем точного количества повторений и нельзя использовать циклы? Используем для этого рекурсию — это когда функция внутри вызывает сама себя. А условие цикла будем проверять с помощью условного оператора if.
Попробуем так сделать простой цикл for, который выведет числа от 1 до 5:
# функция, внутри которой сделаем рекурсию
# на входе — три переменные: переменная цикла, конец и шаг цикла
def loop_for(a,b,c): 
    # если ещё не достигли конца цикла
    if a<=b: 
        # выводим текущее значение переменной цикла
        print(a) 
        # увеличиваем её на шаг цикла
        a+=c 
        # запускаем рекурсию и передаём ей текущие параметры цикла
        loop_for(a,b,c) 
        
# запускаем цикл for
loop_for(1,5,1)

Теперь сделаем цикл с предусловием while-do, когда сначала проверяется условие, и если оно верное — выполняются команды цикла. Но у нас и так текущий код делает почти то же самое, и единственное, что нужно в нём поправить, — убрать переменную с шагом цикла. А всё потому, что в цикле с предусловием нет обязательного шага цикла — его можно организовать и без него, главное, чтобы условие проверялось до выполнения тела цикла, а не после.
# функция, внутри которой сделаем рекурсию
# на входе — две переменные, которые отвечают за условие цикла
def loop_while(a,b): 
    # если ещё не достигли конца цикла
    if a<=b: 
        # выводим текущее значение переменной цикла
        print(a) 
        # меняем значение переменной из условия цикла, чтобы он не был бесконечным
        a+=1 
        # запускаем рекурсию и передаём ей текущие параметры цикла
        loop_while(a,b) 
        
# запускаем цикл while
loop_while(6,10)

Последнее, что нам осталось сделать, — написать цикл с постусловием until. Он работает так: сначала выполняется тело цикла, а потом проверяется условие, и цикл работает до тех пор, пока условие ложно. Как только условие цикла станет истинным — цикл прекращается.
Чтобы сделать такое, нам нужно поставить проверку условия в самый конец, а до этого выполнить все остальные команды:
# функция, внутри которой сделаем рекурсию
# на входе — две переменные, которые отвечают за условие цикла
def loop_until(a,b): 
    # выводим текущее значение переменной цикла
    print(a) 
    # меняем значение переменной из условия цикла, чтобы он не был бесконечным
    a+=1 
    # если условие истинно
    if a>b:
        # выходим из цикла
        pass
    # иначе, если условие оказалось ложным
    else:
        # запускаем рекурсию и передаём ей текущие параметры цикла
        loop_until(a,b) 
        
# запускаем цикл until
loop_until(11,15)

Попробуйте сделать то же самое на JavaScript и поделитесь своими результатами в комментариях.
						




