문제 설명
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수balls
와 친구들에게 나누어 줄 구슬 개수share
이 매개변수로 주어질 때,balls
개의 구슬 중share
개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
function solution(balls, share) {
function factorial(n) {
if (n == 0 || n == 1) {
return 1;
} else {
return n * factorial(n - 1)
}
}
if (balls === share) {
return 1
}
return Math.round(factorial(balls) / (factorial(balls - share) * factorial(share)))
}
"RangeError: Maximum call stack size exceeded"
이 떴다. function factorial(n) {
return n * factorial(n - 1)
}
내가 작성한 함수는 재귀함수이며, 값이 리턴될 때까지 무한 반복하기 때문에 에러가 뜬 것 같았다. 따라서 n의 값이 0 혹은 1일 때를 지정해보았고, 그 후 에러가 더이상 뜨지 않았다. 이와 관련한 에러는 조금 더 공부해보아야 할 것 같다.
이후 balls
와 share
값이 같을 경우 1을 반환하도록 지정해주고, 다를 경우 Hint에 있는 공식을 활용하여 코드를 마저 작성했다.
그리고 처음에는 Math.floor
const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)
function solution(balls, share) {
return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}
이 코드는 따지고 보면 내 코드와 일치한다. 하지만, 이 코드는 삼항 연산자를 사용하였으며, 내가 문제를 겪었던 n
의 범위를 지정해줌으로써 에러를 처음부터 막을 수 있었다.
문제를 풀며 "RangeError: Maximum call stack size exceeded"
를 겪은 것은 처음이었다. 재귀 함수를 사용할 때 범위를 지정해주어 call stack이 넘치지 않도록, 무한 반복하지 않고 빠져나올 수 있도록 코드를 작성할 때 더욱 생각해보고 작성해야겠다.😭