func recursiveFunction() {
// 종료 조건 (Base Case)
if 조건 {
return
}
// 자기 자신을 다시 호출 (Recursive Case)
recursiveFunction()
}
func countdown(_ n: Int) {
if n <= 0 { // 종료 조건
print("끝!")
return
}
print(n)
countdown(n - 1) // 재귀 호출
}
countdown(5)
// 출력 결과
5
4
3
2
1
끝!
countdown(5) 호출 ➡️ 5 출력 ➡️ countdown(4) 호출countdown(4) 호출 ➡️ 4 출력 ➡️ countdown(3) 호출countdown(3) 호출 ➡️ 3 출력 ➡️ countdown(2) 호출countdown(2) 호출 ➡️ 2 출력 ➡️ countdown(1) 호출countdown(1) 호출 ➡️ 1 출력 ➡️ countdown(0) 호출countdown(0) 호출 ➡️ 종료 조건 충족 ➡️ 끝! 출력 후 함수 종료n!)은 n * (n - 1) * (n - 2) * ... * 1을 의미한다.n! = n * (n-1)!
func factorial(_ n: Int) -> Int {
if n == 0 { // 종료 조건 (0! = 1)
return 1
}
return n * factorial(n - 1) // 재귀 호출
}
print(factorial(5)) // 5! = 5 * 4 * 3 * 2 * 1 = 120
// 출력 결과
120
※ 팩토리얼 함수의 호출 과정
factorial(5) = 5 * factorial(4)
factorial(4) = 4 * factorial(3)
factorial(3) = 3 * factorial(2)
factorial(2) = 2 * factorial(1)
factorial(1) = 1 * factorial(0)
factorial(0) = 1 // 종료 조건
n - 1 을 계속 호출하며, n = 0 이 되면 종료된다F(n) = F(n-1) + F(n-2)
F(0) = 0, F(1) = 1
func fibonacci(_ n: Int) -> Int {
if n == 0 { return 0 } // 종료 조건
if n == 1 { return 1 } // 종료 조건
return fibonacci(n - 1) + fibonacci(n - 2) // 재귀 호출
}
print(fibonacci(5)) // 0, 1, 1, 2, 3, 5 → 결과: 5
// 출력 결과
5
※ 피보나치 함수의 호출 과정
fibonacci(5) = fibonacci(4) + fibonacci(3)
fibonacci(4) = fibonacci(3) + fibonacci(2)
fibonacci(3) = fibonacci(2) + fibonacci(1)
...
for 또는 while 루프로 해결 가능하면 반복문이 더 좋음func factorialTail(_ n: Int, _ result: Int = 1) -> Int {
if n == 0 { return result } // 종료 조건
return factorialTail(n - 1, n * result) // 꼬리 재귀
}
print(factorialTail(5)) // 120
var memo: [Int: Int] = [:]
func fibonacciMemo(_ n: Int) -> Int {
if let value = memo[n] {
return value
}
if n == 0 { return 0 }
if n == 1 { return 1 }
memo[n] = fibonacciMemo(n - 1) + fibonacciMemo(n - 2)
return memo[n]!
}
print(fibonacciMemo(50)) // 매우 빠르게 결과 도출