오늘 우연치 않게 나도 모르게 메서드 호출을 함수 안에서 했다. 어쩌다보니 재귀함수를 사용해서 나의 코드는 무한루프에서 빠져나오지 못하고 있었다...
재귀 함수
는 자기 자신을 호출하는 함수로, 특정 문제를 작고 반복적인 작업으로 분해하여 해결하는 데 유용하다고 한다. 특히, 같은 작업을 반복해서 수행하거나, 큰 문제를 작은 하위 문제로 나누어 해결할 때 자주 사용된다.
예를 들어, 가장 많이 들어본 팩토리얼 계산을 통해 재귀 함수의 동작 이해해볼 수 있다.
팩토리얼은 정수 n에 대해서 n!=nx(n−1)x(n−2)x...x1로 정의된다.
func factorial(_ n: Int) -> Int {
if n == 1 {
return 1
}
return n * factorial(n - 1)
}
여기서 factorial 함수는 입력이 1일 때 멈추고, 그렇지 않으면 자기 자신을 호출하며 n에서 1씩 감소한 값을 곱한다. 이렇게 작은 문제로 쪼개어가는 방식으로 해결하는 것이 재귀 함수의 기본 개념이라고 한다.
재귀 함수에는 반드시 종료 조건이 필요하다. 종료 조건이 없으면 함수가 무한히 반복되어 프로그램이 멈추거나 오류가 발생할 수 있다. 종료 조건은 특정 상태가 되면 재귀 호출을 멈추고 결과를 반환하도록 한다.
재귀 함수는 반복적이고 구조적인 문제를 해결하는 데 강력한 함수이다. 하지만 메모리 사용량이나 무한 루프의 위험을 줄이기 위해 적절한 종료 조건을 설정하고, 재귀가 필요한 상황에서만 사용하는 것이 중요하다. 그렇게 나는 탈출 조건도 없는 함수를 재귀함수로 받아와 계속해서 무한루프에 빠졌었던 것이다.