function factorial(end, cur, res){
res = res * cur
if (end === cur) {
return res
}
else factorial(end, cur+1, res);
}
function factorial(end, cur, res){
res = res * cur
if (end === cur) {
return res
}
else return factorial(end, cur+1, res);
}
function factorial(n){
if (n === 1) return 1;
return n * factorial(n-1);
}
javaScript는 기본적으로 문제되는 상황이 발생해도 억지로 가장 그럴듯한 결과를 만들어 오류가 없게 돌아간다.
그러다보니 내가 무슨 문제가 발생하는지조차 알아차리기 힘들 수가 있다.
이번에 내가 간단한 팩토리얼 함수의 예가 그렇다.
3번 코드는 이미 많은 사람들이 잘 알고 있는 유명한 팩토리얼 재귀함수다.
하지만 오래 알고리즘 문제풀이를 쉬었던 터라, 재귀함수의 틀만 알고 있어 1번과 2번의 코드를 작성하게 되었다.
1번 코드에서 꽤 시간을 많이 잡아먹었다. 내 논리대로라면 다음과 같이 작동하였다.
factorial(end = 3, cur = 1, res = 1)
호출res
에cur
이 곱해진 값을 다시res
에 저장factorial의 cur 값을 1을 더해서 재호출
factorial
재귀함수의 종료조건을 만족하면 연산이 끝난res
값 반환
함수의 작동 방식이 스택을 따른다는 것을 미쳐 생각 못했다. 함수 안에서 함수를 호출하게 되면, 그대로 스택이 쌓인다. 나의 재귀함수는 쌓이고 쌓여, 꼭대기에서 종료조건을 만난 후에야 return
을 하게 된다. 하지만 그때 반환되는 값은 이전에 호출한 함수에서 소멸해버린다. 내가 최종적으로 받는 값은 undefined
가 되는 것이다.