설명
재귀 함수가 명확한 종료 조건 없이 자신을 다시 호출하면 입력에 따라 콜스택 고갈이나 무한 실행이 발생할 수 있습니다. 외부에서 호출할 수 있는 경로에서는 입력과 요청량에 따라 서비스 가용성에도 영향을 줄 수 있습니다.
잠재적 영향
- 실행 중 콜스택 고갈이나 무한 실행으로 프로그램이 중단될 수 있습니다.
- 입력 범위에 따라 처리 시간과 자원 사용량이 예측하기 어려워질 수 있습니다.
해결 방법
- 재귀 호출 전에 종료 조건과 입력 범위를 검사하세요.
- 재귀 깊이 제한을 두거나 반복문으로 전환하세요.
예시
변경 전
javascript
function factorial(x) {
return x * factorial(x - 1);
}
변경 후
javascript
function factorial(x) {
if (!Number.isInteger(x) || x < 0 || x > 18) {
throw new RangeError("unsupported input");
}
if (x <= 1) {
return 1;
}
return x * factorial(x - 1);
}
설명:
- 변경 전: 재귀 함수가 명확한 종료 조건 없이 자신을 다시 호출하면 입력에 따라 콜스택 고갈이나 무한 실행이 발생할 수 있습니다.
- 변경 후: 재귀 호출 전에 입력 크기와 종료 조건을 검사합니다. 상한 18은 이 예시에서 팩토리얼을
Number의 안전한 정수 범위 안에서 계산하기 위한 값입니다. 더 큰 정수가 필요하면 적절한 수치 표현과 자원 제한을 사용하세요.