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 재귀 함수 예
# 팩토리얼 연산을 위한 재귀함수를 정의합니다.
<- function(x) {
recursive.factorial if (x == 0) return (1)
else return (x * recursive.factorial(x-1))
}
여기에 자신을 호출하는 함수가 있습니다. recursive.factorial(x)
함수는 x
가 0
이 될 때까지 x * recursive.factorial(x)
를 계속 실행합니다.
x
가 0
이 되면 0
팩토리얼 값이 1
이므로 1
을 반환합니다. 이것은 종료 조건이며 매우 중요한 의미를 갖습니다. 이 조건이 없으면 재귀는 끝나지 않고 (이론상) 무한히 반복됩니다.
다음은 이 함수를 호출하는 몇 가지 예를 보여주고 있습니다.
recursive.factorial(0)
## [1] 1
recursive.factorial(5)
## [1] 120
recursive.factorial(7)
## [1] 5040
재귀함수를 사용하면 종종 코드가 짧아지고 깔끔해 보입니다.
그러나 때때로 코드 로직을 따르기가 어렵습니다. 재귀적인 방식으로 문제를 생각하기 어려울 수 있기 때문입니다.
재귀 함수는 또한 많은 중첩 함수 호출로 이어질 수 있으므로 메모리를 많이 사용합니다. 이것은 큰 문제를 해결하기 위해 사용할 때 명심해야 하는 문제입니다.
연습문제
피보나치 수열을 생성하는 함수를 정의하고, 이 함수를 호출하는 예를 들어보시오.
# 피보나치 수열을 생성하는 함수를 정의합니다.
<- function(x) {
fibonacci 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"
다음의 예제를 확인하기 바랍니다.