Как сделать цикл без цикла?

Как сделать цикл без цикла?

Разбираем очередной вопрос из собеседований

Часто на собеседованиях на младшие позиции компании хотят проверить, как у вас с нестандартным мышлением и решениями в условиях ограничений. Проще говоря — как вы ведёте себя в необычных ситуациях.

Пример такой задачи:
👉 Представьте, что в вашем языке программирования пропали все циклы. Как вы организуете в этом случае три классических цикла: for, while и until? Можно на примере Python или любого другого языка.

Чтобы решить эту задачу, нужно вспомнить, что цикл — это повторение одного и того же несколько раз. Сколько именно раз — зависит от вида цикла.

В каждом цикле есть два важных параметра: 

  1. Переменная цикла, которая должна как-то меняться в процессе.
  2. Условие цикла, по которому этот цикл закончится.

Получается, что в нашем решении обязательно должны быть эти два компонента, чтобы сымитировать работу цикла. Запомним это и подумаем дальше.

Раз нам нельзя использовать циклы, то попробуем сделать так:

  1. Выполняем нужные команды.
  2. Проверяем условия и смотрим, нужно остановиться или продолжаем дальше.
  3. Если продолжаем — снова выполняем нужные команды

Но как нам выполнить команды снова, если мы не знаем точного количества повторений и нельзя использовать циклы? Используем для этого рекурсию — это когда функция внутри вызывает сама себя. А условие цикла будем проверять с помощью условного оператора 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)

Как сделать цикл без цикла?
На экране числа от 1 до 5, значит, цикл работает правильно

Теперь сделаем цикл с предусловием 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 и поделитесь своими результатами в комментариях.

Текст:

Михаил Полянин

Редактор:

Максим Ильяхов

Художник:

Даня Берковский

Корректор:

Ирина Михеева

Вёрстка:

Кирилл Климентьев

Соцсети:

Алина Грызлова

Любите математику? Это для вас
Попробуйте бесплатный тренажер «Основы математики для цифровых профессий». Это все необходимые знания, чтобы закрыть пробелы в математике для айтишника.
Попробовать бесплатно
Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас Любите математику? Это для вас
Получите ИТ-профессию
В «Яндекс Практикуме» можно стать разработчиком, тестировщиком, аналитиком и менеджером цифровых продуктов. Первая часть обучения всегда бесплатная, чтобы попробовать и найти то, что вам по душе. Дальше — программы трудоустройства.
Начать карьеру в ИТ
Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию Получите ИТ-профессию
easy