Часто на собеседованиях на младшие позиции компании хотят проверить, как у вас с нестандартным мышлением и решениями в условиях ограничений. Проще говоря — как вы ведёте себя в необычных ситуациях.
Пример такой задачи:
👉 Представьте, что в вашем языке программирования пропали все циклы. Как вы организуете в этом случае три классических цикла: 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 и поделитесь своими результатами в комментариях.