[JavaScript] 내 팩토리얼 재귀함수가 틀린 이유

알락·2022년 9월 27일
0

알고리즘

목록 보기
4/5
post-thumbnail

1. 문제가 발생한 재귀함수

function factorial(end, cur, res){
  res = res * cur
  if (end === cur) {
    return res
  }
  else factorial(end, cur+1, res);
}

2. 잘 작동하는 팩토리얼 재귀함수

function factorial(end, cur, res){
  res = res * cur
  if (end === cur) {
    return res
  }
  else return factorial(end, cur+1, res);
}

3. 가장 완벽한 팩토리얼 재귀함수

function factorial(n){
 if (n === 1) return 1;
 return n * factorial(n-1);
}

javaScript는 기본적으로 문제되는 상황이 발생해도 억지로 가장 그럴듯한 결과를 만들어 오류가 없게 돌아간다.
그러다보니 내가 무슨 문제가 발생하는지조차 알아차리기 힘들 수가 있다.
이번에 내가 간단한 팩토리얼 함수의 예가 그렇다.

3번 코드는 이미 많은 사람들이 잘 알고 있는 유명한 팩토리얼 재귀함수다.
하지만 오래 알고리즘 문제풀이를 쉬었던 터라, 재귀함수의 틀만 알고 있어 1번과 2번의 코드를 작성하게 되었다.

1번 코드에서 꽤 시간을 많이 잡아먹었다. 내 논리대로라면 다음과 같이 작동하였다.

  1. factorial(end = 3, cur = 1, res = 1) 호출
  2. rescur이 곱해진 값을 다시 res에 저장
  3. factorial의 cur 값을 1을 더해서 재호출
  4. factorial 재귀함수의 종료조건을 만족하면 연산이 끝난 res값 반환

내가 실수 한 것

함수의 작동 방식이 스택을 따른다는 것을 미쳐 생각 못했다. 함수 안에서 함수를 호출하게 되면, 그대로 스택이 쌓인다. 나의 재귀함수는 쌓이고 쌓여, 꼭대기에서 종료조건을 만난 후에야 return을 하게 된다. 하지만 그때 반환되는 값은 이전에 호출한 함수에서 소멸해버린다. 내가 최종적으로 받는 값은 undefined가 되는 것이다.

profile
블록체인 개발 공부 중입니다, 프로그래밍 공부합시다!

0개의 댓글