Рекурсия (базовые примеры)

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

Тренажер по Java

Рекурсия — это приём, когда метод вызывает сам себя для решения задачи. Каждый рекурсивный метод должен содержать:

  • Базовый случай — условие завершения, при котором метод возвращает результат без рекурсивного вызова
  • Рекурсивный случай — вызов метода с изменёнными параметрами, приближающими к базовому случаю

Классические примеры: вычисление факториала n! = n * (n-1)!, числа Фибоначчи, возведение в степень. Без правильного базового случая возникнет бесконечная рекурсия и ошибка StackOverflowError.

Практические задания помогут понять механизм рекурсивных вызовов и научат писать рекурсивные методы.

Список тем

1. Результат факториала

id: 40472_rec_01_predict_factorial

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

Выберите правильный вариант ответа
public class FactorialExample {
    public static int factorial(int n) {
        if (n <= 1) {
            return 1;
        }
        return n * factorial(n - 1);
    }

    public static void main(String[] args) {
        int result = factorial(5);
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

2. Базовый случай

id: 40472_rec_02_replace_base

В этом задании вам предстоит дополнить рекурсивный метод вычисления факториала числа. В коде пропущены ключевые элементы базового случая рекурсии: условие завершения и возвращаемое значение. Ваша задача — вставить корректные выражения так, чтобы метод factorial(int n) корректно вычислял факториал для неотрицательных целых чисел. После заполнения пропусков программа должна выводить результат вычисления факториала числа 5.

Заполните пропуски
public class Factorial {
    public static int factorial(int n) {
        if (input1S) {
            return input2S;
        }
        return n * factorial(n - 1);
    }

    public static void main(String[] args) {
        System.out.println(factorial(5));
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

3. Собери метод факториала

id: 40472_rec_03_build_factorial

Из предложенных строк соберите корректный рекурсивный метод `factorial` на Java, который вычисляет факториал числа n. Метод должен иметь сигнатуру `public static int factorial(int n)`, содержать базовый случай для n <= 1 и рекурсивный вызов с уменьшением аргумента. Одна из строк является лишней и не должна входить в итоговое решение. Обратите внимание на правильный порядок открывающих и закрывающих фигурных скобок.

Перетяните в правильном порядке строки из одного блока в другой
public static int factorial(int n) {
    if (n <= 1) {
        return 1;
    } else {
        return n * factorial(n - 1);
        return n + factorial(n);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

4. Рекурсивная степень

id: 40472_rec_04_give_power

Проанализируйте приведённый ниже код на Java. В нём определён рекурсивный метод power, который возводит число base в степень exp. В методе main этот метод вызывается с конкретными аргументами. Определите, какое число будет выведено на экран в результате выполнения программы. Введите это число в поле ответа.

Что должно получиться?
public class Main {
    public static int power(int base, int exp) {
        if (exp == 0) {
            return 1;
        } else {
            return base * power(base, exp - 1);
        }
    }
    public static void main(String[] args) {
        int result = power(2, 3);
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку

5. Бесконечная рекурсия

id: 40472_rec_05_error_infinite

В данном фрагменте кода представлен рекурсивный метод, который должен выводить числа от заданного значения до 1. Однако в коде допущена ошибка, приводящая к бесконечной рекурсии и, как следствие, к переполнению стека. Найдите строку с ошибкой и исправьте её, чтобы метод работал корректно.

Найдите ошибку и исправьте
public class Main {
    public static void main(String[] args) {
        printNumbers(5);
    }
 
    static void printNumbers(int n) {
        if (n == 0) {
            return;
        }
        System.out.println(n);
        printNumbers(n);
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

6. Порядок вызовов

id: 40472_rec_06_sequence_calls

Перед вами перемешанные шаги, описывающие последовательность вызовов и возвратов при вычислении факториала числа 4 с помощью рекурсии. Расставьте эти шаги в правильном порядке, отражающем реальный процесс выполнения рекурсивной функции factorial(4). Правильная последовательность покажет, как рекурсия углубляется до базового случая, а затем возвращает значения обратно.

Расставьте строки в правильном порядке
Вызов factorial(2): вычисление 2 * factorial(1).
Возврат значений: factorial(2) возвращает 2, factorial(3) возвращает 6, factorial(4) возвращает 24.
Вызов factorial(3): вычисление 3 * factorial(2).
Вызов factorial(1): базовый случай, возвращает 1.
Вызов factorial(4): вычисление 4 * factorial(3).
Сообщения
Проверить
Показать подсказку

7. Части рекурсии

id: 40472_rec_07_sort_parts

Перед вами фрагменты кода и описания, связанные с рекурсивными методами в Java. Разнесите их по двум категориям: «Базовый случай» и «Рекурсивный случай». Базовый случай — это условие, при котором рекурсия завершается, и метод возвращает конкретное значение без дальнейших вызовов. Рекурсивный случай — это часть метода, где происходит вызов самого метода с изменёнными параметрами. Обратите внимание, что в рекурсивном случае метод вызывает сам себя, а в базовом — нет. Каждый элемент должен оказаться ровно в одной категории.

Перетяните элементы в соответствующие блоки
Базовый случай
Рекурсивный случай
if (n == 0) return 1;
return n * factorial(n - 1);
if (index >= array.length) return;
return fibonacci(n - 1) + fibonacci(n - 2);
return 0;
process(array, index + 1);
Сообщения
Проверить
Показать подсказку

8. Числа Фибоначчи

id: 40472_rec_08_fibonacci_predict

Проанализируйте рекурсивный метод вычисления числа Фибоначчи и определите, какое значение будет выведено в консоль при вызове этого метода с аргументом 5. Обратите внимание на базовые случаи и рекурсивные вызовы.

Выберите правильный вариант ответа
public class FibonacciExample {
    public static int fibonacci(int n) {
        if (n <= 1) {
            return n;
        }
        return fibonacci(n - 1) + fibonacci(n - 2);
    }

    public static void main(String[] args) {
        int result = fibonacci(5);
        System.out.println(result);
    }
}
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру