재귀 함수를 만들 때는 다음과 규칙을 지키는 것이 좋다고 알려져 있다.
1 언제 멈출지 알아야 한다.
2 문제를 더 작은 문제나 한 단계로 풀 수 있는 문제로 작게 분리한다.
3 한 단계에서 무엇을 실행할지 결정한다.
🪄트램펄린 구조
자바스크립트는 너무 많은 재귀 호출이 이루어지면 쉽게 스택 깨짐이 발생한다.
이것을 방지하기 위해서는 트램펄린 구조를 이용해 스택 깨짐을 피할 수 있다.
----------
// 🔓스택 깨짐 발생 코드
const isEven = n => n === 0 ?
true :
isOdd(Math.abs(n) - 1)
const isOdd = n => n === 0 ?
false :
isEven(Math.abs(n) - 1)
isEven(100000)
// Uncaught RangeError: Maximum call stack size exceeded
----------
----------
//🔒트램펄린 적용 코드
const isEven = n => n === 0 ?
true :
() => isOdd(Math.abs(n) - 1) // 함수로 변경
const isOdd = n => n === 0 ?
false :
() => isEven(Math.abs(n) - 1) // 함수로 변경
const trampoline = (fun, arg) => {
let result = fun(arg)
while (typeof result === "function") {
result = result()
}
return result
}
trampoline(isEven, 100000) // true
----------
다음 내용이 궁금하다면?
이미 회원이신가요?
2024년 2월 5일 오전 6:47