Рекурсия в Java — это вызов метода методом внутри метода. Это действие повторяется до тех пор, пока не будет выполнено условие. Метод должен быть методом в классе, отличном от метода в основном классе. Основной класс — это класс, который имеет метод main(). Имя файла Java совпадает с именем основного класса. Статический метод в основном классе все еще можно сделать рекурсивным, но в этой статье это не рассматривается. В этой статье объясняется рекурсия в Java с тремя хорошими примерами.
Рассмотрим файл Java с двумя классами: закрытый класс следующим образом:
class AClass { void mthd (int no) { System.out.print(no); System.out.print(' '); no = no + 1; if (no < 5) mthd(no); } }
Метод, который будет вызывать сам себя, mthd(). Он имеет параметр «int no». Метод находится в классе AClass. Этот метод считает от 0 до 4. Первая строка метода содержит два утверждения. Первый печатает параметр no. Второй печатает пробел справа от напечатанного параметра. В следующей строке к номеру добавляется 1. Следующая строка представляет собой составной оператор if. Есть условие, которое должно быть выполнено. Условие, которое должно быть выполнено, это когда no достигает 5. Если 5 не достигнуто, «mthd(no);» называет себя без добавления 1 к нему.
Основным классом для этого метода может быть,
public class TheClass { public static void main(String[] args) { int num = 0; AClass obj = new AClass(); obj.mthd(num); System.out.println(); } }
Первый оператор в методе main() объявляет целое число, num присваивая ему ноль. Для вызова метода объект должен быть создан из своего класса. Следующий оператор в методе main() создает экземпляр объекта obj из AClass. Оператор after использует этот объект для вызова метода mthd(), передавая ему аргумент num, равный 0. Это начало отсчета. Последний оператор в методе main() печатает новую строку после того, как весь результат был напечатан. Результат:
0 1 2 3 4
Рекурсивный метод mthd() вызывается в первый раз из метода main(). После этого он продолжает вызывать себя, пока не будет выполнено условие.
Такой подсчет можно сделать для любого диапазона. Чтобы достичь этого для любого диапазона, начальный номер диапазона должен быть присвоен num. Вместо 5 для условия if в методе следует ввести число сразу после диапазона.
Рассмотрим цифры:
10, 20, 30, 40, 50, 60
Сумма первых 4-х чисел равна 100. То есть: 10+20=30; 30 + 30 = 60; и 60 + 40 = 100. Рекурсивный метод может состоять в добавлении этих чисел к возрастающей сумме до тех пор, пока сумма не станет меньше или равной 100. Чтобы сложить первые пять чисел, рекурсивный метод может состоять в добавлении чисел к возрастающей сумме. sum до тех пор, пока сумма не станет меньше или равна 150.
Стратегия состоит в том, чтобы иметь все эти числа в массиве в методе main(). Затем передайте массив в качестве аргумента рекурсивному методу. Если требуется сложение первых четырех чисел, то при достижении суммы 100 рекурсивный метод должен перестать вызывать себя. Если требуется сложение первых пяти чисел, то при достижении суммы 150 рекурсивный метод должен перестать вызывать себя. Если требуется сложение первых шести чисел, то при достижении суммы 210 рекурсивный метод должен перестать вызывать себя.
Класс для этого рекурсивного метода может быть:
class AClass { int sum = 0, i = 0; void mthd (int[] arry) { sum = sum + arry[i]; i = i + 1; if (sum < 100) mthd(arry); } }
Это для сложения первых четырех чисел. В классе есть два поля: sum и i. i предназначен для перебора массива, начиная с индекса 0. Первый оператор рекурсивного метода, mthd(), добавляет следующее число к сумме, которая изначально равна нулю. Следующий оператор увеличивает i на 1 для следующего индекса массива следующего вызова. Оператор после является составным оператором if. Условие здесь — сумма не должна быть выше 100. Итак, при каждом вызове того, что сумма не до 100 (или выше), метод вызывается снова, передавая тот же массив. В этой ситуации условие находится в конце реализации метода.
Класс main() для этого может быть:
public class TheClass { public static void main(String[] args) { int[] arr = new int[]{10, 20, 30, 40, 50, 60}; AClass obj = new AClass(); obj.mthd(arr); System.out.println(obj.sum); } }
Первый оператор в методе main() создает экземпляр массива с его элементами. Второй оператор создает экземпляр объекта для AClass. Оператор после вызывает рекурсивный метод, передавая массив в качестве аргумента. Это первый вызов рекурсивного метода. После этого метод будет вызывать сам себя до тех пор, пока не будет достигнута необходимая сумма. Последний оператор печатает окончательную сумму. Выход для этого случая равен 100.
Факториал 0, записанный как 0!, равен 1. Факториалы 5, 4, 3, 2, 1 следующие:
Factorial of 5 = 5 X 4 X 3 X 2 X 1 X 0! = 120 Factorial of 4 = 4 X 3 X 2 X 1 X 0! = 24 Factorial of 3 = 3 X 2 X 1 X 0! = 6 Factorial of 2 = 2 X 1 X 0! = 2 Factorial of 1 = 1 X 0! = 1
Программу можно написать так, что когда число передается рекурсивному методу, рекурсивный метод, в конце концов, возвращает результирующий факториал. Обратите внимание, что факториал можно вычислить до 1 вместо 0, и результат останется тем же.
Класс для рекурсивного метода может быть:
class AClass { int mthd (int no) { if (no == 1) return 1; else return(no * mthd(no-1)); } }
Все тело метода представляет собой составное условие if. Если число, факториал которого необходим, равно 1, то будет возвращено 1, так как факториал 1 равен 1. Если число больше 1, то все умножения должны быть выполнены, начиная с самого числа, уменьшившись на 1 единицу.
Результат получается, когда все умножение сделано. Возвращаемое выражение здесь является вызовом метода. Его аргумент является произведением числа и рекурсивного метода.
Предположим, что число, факториал которого нужен, равно 5, тогда аргумент первого обратного вызова будет:
5 X mthd(4)
Это выражение будет зарезервировано в памяти, и следующий вызов будет
5 X 4 X mthd(3)
Это выражение будет зарезервировано в памяти, и следующий вызов будет
5 X 4 X 3 X mthd(2)
Это выражение будет зарезервировано в памяти, и следующий вызов будет
5 X 4 X 3 X 2 X mthd(1)
Теперь mthd(1) возвращает 1 из-за оператора if-part «if (no == 1) return 1;», в результате чего
5 х 4 х 3 х 2 х 1 = 120
для окончательного возвращаемого значения.
Основным классом для этого может быть:
public class TheClass { public static void main(String[] args) { AClass obj = new AClass(); int ret = obj.mthd(5); System.out.println(ret); } }
С аргументом 5 для первого вызова в методе main() окончательное возвращаемое значение равно 120.
Рекурсия в Java — это вызов метода методом внутри метода. Это действие повторяется до тех пор, пока не будет выполнено условие.