Рекурсивные функции

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Рекурсия — это мощный, но иногда запутанный инструмент в программировании. Суть её в том, что функция вызывает саму себя для решения подзадачи. Чтобы не уйти в бесконечность, у каждой рекурсивной функции должен быть базовый случай — точка выхода. В этом наборе заданий мы начнём с самых основ: разберёмся в терминах, напишем простую рекурсивную функцию, научимся находить ошибки, приводящие к бесконечным циклам, и постепенно перейдём к более сложным задачам, таким как работа с массивами. Эти упражнения помогут вам понять логику рекурсивных вызовов и научиться применять их на практике.

Список тем

Основы рекурсии: Термины и определения

id: 39000_task_compare_1

Чтобы уверенно использовать рекурсию, нужно понимать её ключевые компоненты. Сопоставьте каждый термин с его правильным определением. Это foundational знание для всех последующих задач.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Базовый случай
Рекурсивный вызов
Бесконечная рекурсия
Стек вызовов
Вызов функцией самой себя, но с измененными аргументами, приближающими к решению.
Ситуация, когда базовый случай никогда не достигается, приводящая к переполнению памяти.
Условие, при котором функция прекращает вызывать саму себя и возвращает конкретное значение.
Механизм, который отслеживает активные вызовы функций. При рекурсии он "запоминает" состояние каждого вызова.
Сообщения
Проверить
Показать подсказку

Простая рекурсия: Обратный отсчет

id: 39000_task_replace_2

Напишите свою первую рекурсивную функцию. Заполните пропуски в коде так, чтобы функция `countdown` выводила числа от заданного `n` до 1. Вам нужно определить условие выхода и сам рекурсивный вызов.

Заполните пропуски
function countdown($n) {
    // Базовый случай: останавливаемся, когда считать больше нечего
    if (input1S) {
        return;
    }

    echo $n . " ";

    // Рекурсивный шаг: вызываем себя с меньшим числом
    input2S;
}

countdown(5);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Поиск ошибки: Бесконечная рекурсия

id: 39000_task_error_3

В этом коде спрятана одна из самых частых ошибок при работе с рекурсией. Функция должна считать факториал числа, но вместо этого вызывает бесконечный цикл и ошибку. Найдите и исправьте строку, которая вызывает проблему.

Найдите ошибку и исправьте
<?php
function factorial($n) {
    // Базовый случай: факториал 1 равен 1
    if ($n <= 1) {
        return 1;
    }
    // Рекурсивный шаг с ошибкой
    return $n * factorial($n);
}
 
echo factorial(3);
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Предсказание результата: Факториал

id: 39000_task_give_result_4

Теперь, когда вы знакомы с функцией вычисления факториала, предскажите, какой результат вернет вызов `factorial(4)`. Введите только число.

Что должно получиться?
function factorial($n) {
    if ($n <= 1) {
        return 1;
    }
    return $n * factorial($n - 1);
}

echo factorial(4);
Сообщения
Проверить
Показать подсказку

Сборка из частей: Сумма чисел до N

id: 39000_task_build_from_parts_5

Соберите из разрозненных строк кода рабочую рекурсивную функцию, которая вычисляет сумму всех целых чисел от 1 до `n`. Некоторые строки лишние и приведут к ошибке.

Перетяните в правильном порядке строки из одного блока в другой
return $n + sumTo($n - 1);
if ($n <= 1) { return 1; }
function sumTo($n) {
return $n + sumTo($n);
}
if ($n == 0) { return 0; }
while($n > 0) {
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Рекурсия и массивы: Сумма элементов

id: 39000_task_bank_fill_6

Рекурсию часто используют для обработки структур данных, например, массивов. Заполните пропуски, используя элементы из банка, чтобы создать функцию, которая суммирует все числа в массиве.

Нужно правильно расставить в пропуски предложенные варианты
function sumArray(array $arr): int
{
    // Базовый случай: если массив пуст, сумма равна 0
    if (input1S) {
        return 0;
    }

    // Рекурсивный шаг: первый элемент + сумма остальных
    return input2S + sumArray(input3S);
}

$numbers = [10, 20, 30];
echo sumArray($numbers);
$arr[0]
count($arr) === 1
array_slice($arr, 1)
$arr
empty($arr)
array_pop($arr)
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Стек вызовов: Рекурсивный вывод строки

id: 39000_task_predict_result_7

Проанализируйте этот код. Что именно он выведет? Обратите пристальное внимание на то, где находится `echo` по отношению к рекурсивному вызову. Это определяет порядок вывода.

Выберите правильный вариант ответа
function printInverted($n) {
    if ($n <= 0) {
        return;
    }
    printInverted($n - 1);
    echo $n . " ";
}

printInverted(4);
Сообщения
Проверить
Показать подсказку

Сложная ошибка: Потерянный результат

id: 39000_task_error_8

Эта функция должна "выпрямлять" вложенный массив в один плоский. Например, из `[1, [2, 3]]` делать `[1, 2, 3]`. Сейчас в ней есть логическая ошибка: результат рекурсивного вызова для вложенных массивов теряется. Исправьте строку, чтобы исправить это.

Найдите ошибку и исправьте
function flatten($array) {
    $flatArray = [];
    foreach ($array as $element) {
        if (is_array($element)) {
            flatten($element);
        } else {
            $flatArray[] = $element;
        }
    }
    return $flatArray;
}
 
$nested = [1, [2, 3], 4, [5, [6]]];
print_r(flatten($nested)); // Ожидаемый вывод: [1, 2, 3, 4, 5, 6]
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
🚀 Визуализатор кода
0 / 0
Скорость:
Режим:
💡 Что происходит?
Загрузите пример для начала...
🤔
Проверка знаний
История шагов
Готов
НайтиКурс.Ру