16.5 R 재귀 함수

이 절에서는 R 프로그래밍에서 재귀 함수(recursive function, 자신을 호출하는 함수)를 생성하는 방법에 대해 살펴 보겠습니다.

자신을 호출하는 함수를 재귀 함수라고 하며, 이러한 기술을 재귀(recursion)라고합니다.

이 특수 프로그래밍 기술은 문제를 더 작고 간단한 하위 문제로 나누어 문제를 해결하는 데 사용할 수 있습니다.

다음의 예를 통하여 이 개념을 살펴보도록 하겠습니다.

숫자의 팩토리얼의 결과를 찾는 예를 들어 보겠습니다. 양의 정수의 팩토리얼은 1에서 해당 숫자까지의 모든 정수의 곱 즉 \[ (n! = 1 \times 2 \times \cdots \times n) \] 으로 정의됩니다. 예를 들어 5의 팩토리얼은 ( 5!로 표시)은 다음과 같습니다.

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

5의 팩토리얼을 찾는이 문제는 4의 계승과 5를 곱하는 하위 문제로 나눌 수 있습니다. 즉,

5! = 5*4!

이를 일반적인 식으로 표현하면 다음과 같습니다.

n! = n*(n-1)!

이제 우리는1의 값을 갖는 0!에 도달할 때까지 이 연산을 계속할 수 있습니다.

이제 이러한 팩토리얼 연산을 구현하는 함수는 다음과 같이 작성할 수 있습니다.

16.5.1 재귀 함수 예

# 팩토리얼 연산을 위한 재귀함수를 정의합니다.
recursive.factorial <- function(x) {
                           if (x == 0)    return (1)
                           else           return (x * recursive.factorial(x-1))
}

여기에 자신을 호출하는 함수가 있습니다. recursive.factorial(x) 함수는 x0이 될 때까지 x * recursive.factorial(x)를 계속 실행합니다.

x0이 되면 0 팩토리얼 값이 1이므로 1을 반환합니다. 이것은 종료 조건이며 매우 중요한 의미를 갖습니다. 이 조건이 없으면 재귀는 끝나지 않고 (이론상) 무한히 반복됩니다.

다음은 이 함수를 호출하는 몇 가지 예를 보여주고 있습니다.

recursive.factorial(0)
## [1] 1
recursive.factorial(5)
## [1] 120
recursive.factorial(7)
## [1] 5040

재귀함수를 사용하면 종종 코드가 짧아지고 깔끔해 보입니다.

그러나 때때로 코드 로직을 따르기가 어렵습니다. 재귀적인 방식으로 문제를 생각하기 어려울 수 있기 때문입니다.

재귀 함수는 또한 많은 중첩 함수 호출로 이어질 수 있으므로 메모리를 많이 사용합니다. 이것은 큰 문제를 해결하기 위해 사용할 때 명심해야 하는 문제입니다.

연습문제

피보나치 수열을 생성하는 함수를 정의하고, 이 함수를 호출하는 예를 들어보시오.

# 피보나치 수열을 생성하는 함수를 정의합니다.
fibonacci <- function(x) {
  if (x < 0) print("양의 정수 값을 입력해 주세요.")
  else if (x < 2) return(1)
  else return(fibonacci(x-1) + fibonacci(x-2))
}

# fibonacci() 함수를 호출하여 0:10 까지의 피보나치 수를 생성합니다.
for (i in 0:10)                    
print(paste0("Fibonacci Number of ", i, " = ", fibonacci(i)))
## [1] "Fibonacci Number of 0 = 1"
## [1] "Fibonacci Number of 1 = 1"
## [1] "Fibonacci Number of 2 = 2"
## [1] "Fibonacci Number of 3 = 3"
## [1] "Fibonacci Number of 4 = 5"
## [1] "Fibonacci Number of 5 = 8"
## [1] "Fibonacci Number of 6 = 13"
## [1] "Fibonacci Number of 7 = 21"
## [1] "Fibonacci Number of 8 = 34"
## [1] "Fibonacci Number of 9 = 55"
## [1] "Fibonacci Number of 10 = 89"

다음의 예제를 확인하기 바랍니다.