English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Java 기본 튜토리얼

Java 흐름 제어

Java 배열

Java 상대적 객체(I)

Java 상대적 객체(II)

Java 상대적 객체(III)

Java 예외 처리

Java 목록(List)

Java Queue(큐)

Java Map 셋

Java Set 셋

Java 입력 출력(I/O)

Java Reader/Writer

Java 다른 주제

Java 재귀

이 튜토리얼에서는 Java 재귀 함수와 그 장단점을 배웁니다.

Java에서는 자신을 호출하는메서드재귀 메서드라고 합니다. 그리고 이 과정을 재귀라고 합니다.

물리 세계의 예는 서로 마주보고 있는 두 개의 평행 반사镜입니다. 그들 사이의 어떤 물체도 재귀적으로 반사됩니다.

재귀는 어떻게 작동합니까?

Java 재귀 작업流程도

위의 예제에서 우리는 main 메서드 내부에서 recurse() 메서드를 호출했습니다.  (정상적인 메서드 호출). 그리고 recurse() 메서드 내부에서 다시 같은 recurse 메서드를 호출했습니다. 이것은 재귀 호출입니다.

재귀 호출을 중지하기 위해 메서드 내부에 조건을 제공해야 합니다. 그렇지 않으면 이 메서드가 무한 호출됩니다.

따라서 우리는if ... else 문(또는 유사한 방법)종료 메서드 내부의 재귀 호출을 중지합니다。

예제:재귀를 사용한 대수

class Factorial {
    static int factorial( int n ) {
        if (n != 0)  // 종료 조건
            return n * factorial(n-1); //재귀 호출
        else
            return 1;
    }
    public static void main(String[] args) {
        int number = 4, result;
        result = factorial(number);
        System.out.println(number + " 의 대수= " + result);
    }
}

출력

4 의 대수 24

위의 예제에서 factorial() 메서드가 있습니다. main() 메서드에서 factorial()를 호출합니다. 전달된 숫자 변수를 매개변수로 사용합니다.

여기서 주의해야 할 다음과 같은 문장이 있습니다:

return n * factorial(n-1);

factorial() 메서드가 자신을 호출하고 있습니다. 초기에 n의 값은 factorial() 내부에서4. 다음 재귀 호출 중에,3factorial() 메서드에 전달됩니다. 이 과정은 n이 0이 되까지 지속됩니다.

n이 0이 되면, if 문이 false를 반환하여 return1. 마지막으로, 누적된 결과를 main() 메서드에 전달합니다.

팩토리얼 프로그램의 작업流程

아래 그림은 재귀를 사용하여 팩토리얼 프로그램을 실행하는 방법을 더 잘 이해하도록 도와줍니다.

재귀를 사용하는 팩토리얼 프로그램

재귀의 장단점

재귀 호출을 할 때, 스택에 새로운 변수 저장 위치가 할당됩니다. 각 재귀 호출이 반환될 때마다, 오래된 변수와 매개변수는 스택에서 제거됩니다. 따라서, 재귀는 일반적으로 더 많은 메모리를 사용하며 일반적으로 더 느리게 작동합니다.

다른 한편, 재귀 솔루션은 더 간단하며 작성, 디버깅 및 유지보수에 더 적은 시간이 소요됩니다.