Table of contents
Open Table of contents
Factorial 알고리즘을 구현하는 두 가지 방법
단순 반복문을 활용하는 방법
const fnum = 5 // 5!
let res = 1
for(let i = 1; i < fnum; i++) {
res = res * (i + 1)
}
console.log(res) // 120
재귀 함수로 구현하는 방법
const factorial = (n) => {
if (n === 0 || n === 1) return 1
return n * factorial(n - 1)
}
console.log(factorial(5)) // 120
factorial(5) 함수의 반환 값을 얻으려면 factorial(4) 함수의 반환 값이 필요하고, factorial(4) 함수는 factorial(3), factorial(3)은 factorial(2), factorial(2)는 factorial(1)의 결과가 필요하다.
factorial(1)일때 재귀적 함수 호출이 멈추는 것을 알 수 있다.
따라서 5 -> 1 방향으로 호출이 이루어지고, 반대로 1 -> 5 방향으로 반환하면서 결과를 계산한다.
| factorial 함수의 재귀 호출 시 스택 구조 |
|---|
| factorial(1) (factorial(2) 함수에서 호출. 1 반환) |
| factorial(2) (factorial(3) 함수에서 호출. 2 반환) |
| factorial(3) (factorial(4) 함수에서 호출. 6 반환) |
| factorial(4) (factorial(5) 함수에서 호출. 24 반환) |
| factorial(5) (최초 함수 호출. 120 반환) |