[자료구조] 재귀함수(Recursion)

1. 재귀함수란?

  • 자신의 함수 내부에서 자기 자신을 스스로 호출함으로써 재귀적으로 문제를 해결하는 함수이다.

  • 재귀함수는 아주 간격하고 직관적인 코드로 문제를 해결할 수 있게 해준다.

  • 반면 때에 따라서는 심각한 비효율성을 초래할 수 있기 때문에 유의가 필요하다.

  • 반복함수는 for, while을 활용한 함수이다.

팩토리얼 구현하기

  • 반복함수로 구현하기
public static int factorial(int  number) {
    int sum = 1;
    for(int i = 2; i<= number; i++) {
        sum *= i;
    }
    return sum;
}
  • 재귀함수로 구현하기
public static int factorial(int  number) {
    if(number == 1)
        return 1;
    else
        return number * factorial(number - 1);
    // 5! = 5 * 4!
    // 5! = 5 * 4 * 3!
    // 5! = 5 * 4 * 3 * 2!
    // 5! = 5 * 4 * 3 * 2 * 1
}

피보나치 수열 구현하기

  • 반복함수로 구현하기
public static int fibonacci(int number) {
    int one = 1;
    int two = 1;
    int result = -1;
    if(number == 1)
    {
        return one;
    }
    else if(number == 2)
    {
        return two;
    }
    else
    {
        for(int i = 2; i < number; i++)
        {
            result = one + two;
            one = two;
            two = result;
        }
    }
    return result;
}
  • 재귀함수로 구현하기
public static int fibonacci(int number) {
    if(number == 1)
        return 1;
    else if(number == 2)
        return 1;
    else
    {
        return fibonacci(number - 1) + fibonacci(number - 2);
    }
}
  • 재귀함수의 단점

image

위처럼 중복처리되는 경우가 많고, 한 단계 증가할 때마다 2배씩 증가하는 것을 볼 수 있다.