Skip to main content

Рекурсия

Рекурсия – это очень удобная технология, но она сложная для понимания.

Рекурентные методы – это методы, которые вызывают внутри своего тела себя самих.

Например, рассмотрим задачу нахождения i-го числа Фибоначчи.

I-е число Фибоначчи является по определению суммой (i-1)-го и (i-2)-го чисел при i>2. Первые два числа Фибоначчи равны единицам.

int fib(int n){
if (n == 1||n==2) return 1;
else return fib(n-1)+fib(n-2);
}

Разберём более сложную задачу:

Напишите программу, c помощью рекуррентного метода, которая читает с клавиатуры целые числа, пока не будет введен 0 и выводит их в обратном порядке. Чисел гарантированно не больше 1000.

import java.util.Scanner;
public class Main {
static Scanner sc = new Scanner(System.in);
static void myMethod(int cnt,int [] arr) {
int a = sc.nextInt();
if (a == 0) {
for (int i = cnt-1; i >= 0; i--) {
System.out.print(arr[i]+" ");
}
} else {
arr[cnt]=a;
myMethod(cnt+1,arr);
}
}
public static void main(String[] args) {
int arr[] = new int[1000];
int cnt = 0;
myMethod(cnt,arr);
}
}

В этой программе есть несколько важных моментов.

static Scanner sc = new Scanner(System.in);

Переменную sc мы выносим из тела main, чтобы она была доступна в других методах. Т.к. статичные методы могут работать только со статичными полями, то нам необходимо добавить в объявление сканера ключевое слово static.

static void myMethod(int cnt,int [] arr) {
...

Объявление метода выполнено с использованием ключевого слова static по тем же соображениям. В качестве аргументов этому методу мы передаём массив, в который будем записывать считанные значения и кол-во уже прочитанных значений. Дальше логика работы метода проста: считываем новое число, если оно равно нулю, то просто выводим элементы полученного в качестве аргумента массива в обратном порядке, если нет, то добавляем новый элемент массива, увеличиваем кол-во занесённых элементов в массив и вызываем метод заново но уже с новыми параметрами.