본문 바로가기
JAVA

JAVA(재귀함수)

by 글로리. 2020. 6. 4.

01. 재귀함수

  • 메서드 본인이 본인을 호출하도록 하는 함수

1) 팩토리얼 구하기

  • 5! = 5 * 4 * 3 * 2 * 1
    = 120

* 반복문을 통한 구현

public class Factorial1
{
    public static void main(String[] args)
    {
        // 팩토리얼을 구하기 위한 메서드 호출
        long result = getFactorial(5);
        // 결과 출력
        System.out.println(result);
    }

    public static long getFactorial(int max)
    {
        long result = 1;
        for (int i = max; i > 0; i--)
        {
            result *= i;
        }
        return result;
    }
}

// 실행결과
120

2) 재귀호출을 통한 구현

  • 재귀호출은 종료 조건을 명시하지 않으면 무한루프에 빠짐.
    재귀호출을 구현할때 가장 먼저 해야 하는 것은 종료조건을 명시하는것.
 // 곱셈에서 1은 무의미 하므로
 // 조건값이 1보다 작거나 같으면 1을 리턴
if (max <= 1) {
    return 1;
}
  • 팩토리얼을 분석하면 아래와 같이 정의할 수 있다
    f(x) = x\*f(x+1) 단, x가 1이하인 경우는 1
public class Factorial2
{
    public static void main(String[] args)
    {
        // 팩토리얼을 구하기 위한 메서드 호출
        long result = getFactorial(5);
        // 결과 출력
        System.out.println(result);
    }

    public static long getFactorial(int max)
    {
        if (max <= 1)
        {
            return 1;
        }

        return max * getFactorial(max-1);
    }
}

// 실행결과
120

02. 총 합 구하기

1) 양의 정수 n을 입력받아 1부터 n까지의 총 합을 구하는 기능을 재귀합수로 구현

  • n부터 1씩 감소하면서 합산을 하고 1이 되는 순간 종료.
    예를 들어 n이 5일 때, 5 + 4 + 3 + 2 + 1이 되어야 한다.
    이를 표현하면 다음과 같다.
f(1) = 1
f(n) = n + f(n-1)
  • 이 수식을 프로그램으로 구현한 결과는 아래와 같다.
import java.util.Scanner;

public class MySum {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.print("양의 정수를 입력하세요: ");
        int n = sc.nextInt();

        int s = sum(n);
        System.out.println("결과값: " + s);
    }

    public static int sum(int n) {
        if (n == 1) {
            System.out.println(n);
            return 1;
        }

        System.out.print(n + " + ");
        return n + sum(n-1);
    }
}

// 실행결과
D:\>java MySum
양의 정수를 입력하세요: 5
5 + 4 + 3 + 2 + 1
결과값: 15

D:\>java MySum
양의 정수를 입력하세요: 7
7 + 6 + 5 + 4 + 3 + 2 + 1
결과값: 28

D:\>java MySum
양의 정수를 입력하세요: 10
10 + 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1
결과값: 55

03. 구구단

  • 구구단을 재귀함수로 출력
public class Gugu
{
    public static void main(String[] args)
    {
        printGugu(7, 1);
    }
    public static void printGugu(int level, int depth)
    {
      if (depth > 9)
      {
          return;
      }

      System.out.printf("%d x %d = %d\n", level, depth, level*depth);
      printGugu(level, depth+1);
  }
}

// 실행결과
7 x 1 = 7
7 x 2 = 14
7 x 3 = 21
7 x 4 = 28
7 x 5 = 35
7 x 6 = 42
7 x 7 = 49
7 x 8 = 56
7 x 9 = 63

04. 피보나치 수열

  • 피보나치 수는 다음와 같은 초기값 및 점화식으로 정의되는 수열.

    F(0)=0
    F(1)=1
    F(n)=F(n-1)+F(n-2)

  • 아래는 피보나치 수열을 그림으로 표현
    Imgur

1) 코드로 표현

public class Fibo {
    public static void main(String[] args) {
        // 0부터 8까지의 피보나치 수 모두 출력
        for (int i=0; i<9; i++) {
            System.out.printf("%d\t", fibo(i));
        }
    }

    public static int fibo(int n) {
        // 전달받은 값과 동일한 값을 리턴한다면 계산할 필요가 없으므로 중단
        if (n <= 1) {
            return n;
        } else {
            return fibo(n-2) + fibo(n-1);
        }
    }
}

// 실행결과
0   1   1   2   3   5   8   13  21

'JAVA' 카테고리의 다른 글

JAVA(자바빈즈(Java Beans), 은닉성, 상속성)  (0) 2020.06.09
JAVA(클래스, 객체, 생성자)  (0) 2020.06.04
JAVA(값 복사 / 참조 복사)  (0) 2020.06.03
JAVA(메서드)  (0) 2020.06.03
JAVA(2차 배열)  (0) 2020.06.02

댓글