출처 : https://www.codetree.ai/missions/5/problems/maximum-value-with-recursive-function/description
배열의 원소 개수와 배열의 원소가 주어지면, 재귀함수 를 이용해 원소 중 최댓값을 구한다.
// 입력
6
1 5 7 9 2 6
// 출력
9
import java.util.Scanner;
public class Main {
static int[] arr;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int length = sc.nextInt();
arr = new int[length];
for (int i = 0; i < length; i++) {
arr[i] = sc.nextInt();
}
System.out.println(getMax(0));
}
private static int getMax(int idx) {
if (idx == arr.length - 1) {
return arr[idx];
}
return Math.max(arr[idx], getMax(idx + 1));
}
}
어떻게 이걸 재귀적으로 풀 수 있을까 하고 꽤 고민하였다. 그러다 개념시간에 배운 ‘재귀적’ 구조를 찾는 것에 집중하였고, 첫 번째 원소
와, 첫 번째 원소를 제외한 배열
중 최댓값을 리턴하는 형태로 접근하였다.
재귀 함수를 계속 호출하면서, 재귀 함수에서의 첫 번째 원소
가 실제 배열에서의 마지막 원소가 될 때를 종료조건으로 정했다. 즉 비교 대상이 자기 자신만 남았을 때 더 이상 재귀 호출이 일어나지 않고 return
하도록 하였다.
import java.util.Scanner;
public class Main {
public static final int MAX_N = 100;
public static int[] arr = new int[MAX_N];
// a번째 까지 인덱스의 숫자 중에 가장 큰 값을 반환합니다.
public static int maxValue(int a) {
if (a == 0)
return arr[0];
return Math.max(maxValue(a - 1), arr[a]);
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 변수 선언 및 입력:
int n = sc.nextInt();
for (int i = 0; i < n; i++)
arr[i] = sc.nextInt();
System.out.print(maxValue(n - 1));
}
}
해설에서는 재귀함수의 종료 조건을 비교 대상이 첫 번째 원소 만 남았을 때로 설정하였다.
예로 [1, 4, 2] 배열이 있다고 가정하고, 어떻게 재귀호출이 일어나는지 순서대로 그려보면 아래와 같다.
재귀 호출시 매개변수 a가 0이 되면 그제서야 호출이 종료된다. 종료되면서 가장 마지막 depth부터 최댓값이 계산되면서 depth가 하나씩 올라오게된다.
정말 단순한 구조이지만, 재귀 호출이 익숙하지 않아서인지 제대로 이해하는데까지 시간이 꽤 걸렸다. 역시 손으로 써보면서 과정을 나열해봐야 이해가 잘되는 것 같다.