종료 조건 없는 재귀 호출

종료 조건 없는 재귀 호출

설명

재귀 함수가 명확한 종료 조건 없이 자신을 다시 호출하면 입력에 따라 콜스택 고갈이나 무한 실행이 발생할 수 있습니다. 외부에서 호출할 수 있는 경로에서는 입력과 요청량에 따라 서비스 가용성에도 영향을 줄 수 있습니다.

잠재적 영향

  • 실행 중 콜스택 고갈이나 무한 실행으로 프로그램이 중단될 수 있습니다.
  • 입력 범위에 따라 처리 시간과 자원 사용량이 예측하기 어려워질 수 있습니다.

해결 방법

  • 재귀 호출 전에 종료 조건과 입력 범위를 검사하세요.
  • 재귀 깊이 제한을 두거나 반복문으로 전환하세요.

예시

변경 전

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의 안전한 정수 범위 안에서 계산하기 위한 값입니다. 더 큰 정수가 필요하면 적절한 수치 표현과 자원 제한을 사용하세요.

참조