function foo() {
foo()
}
< Uncaught RangeError: Maximum call stack size exceeded >
: call stack에 더이상 담을 수가 없다는 에러
▼ call stack
어떤 함수가 호출되면, 실행 컨텍스트 execution context가 만들어진다.
! 아래의 예시 문제가 아무리 강의를 돌려봐도 이해가 가지 않아
help desk에 문의도 해보고 구글링도 해본 결과 좋은 글을 남겨주신 덕분에
문제를 이해할 수 있게되었다. !
function factorial(n) {
if (n === 0) {
return 1;
}
return n * factorial(n-1);
}
factorial(2)
/*
1. factorial(3) = 3 * factorial(2)
= 3 * 2 * factorial(1)
= 3 * 2 * 1 * factorial(0)
= 3 * 2 * 1 * 1
= 6
*/
function fibonacci(n) {
if (n < 2)
return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
/*
1. fibonacci(4) + fibonacci(3)
1) fibonacci(4) = fibonacci(3) + fibonacci(2)
1-1) fibonacci(3) = fibonacci(2) + fibonacci(1)
= fibonacci(2) + 1
= ( fibonacci(1) + fibonacci(0) ) + 1
= 1 + 1
= 2
1-2) fibonacci(2) = 1
* 1번 결과 fibonacci(4) = 2 + 1 = 3
2) fibonacci(3) = fibonacci(2) + fibonacci(1)
= 1 + 1 = 2
* 2번 결과 = 2
1번 + 2번 합은 5
*/
1) 팩토리얼 함수 참고 링크
https://www.everdevel.com/JavaScript/recursive-function.php
2) 피보나치 수열 참고 링크
https://www.codeit.kr/questions/1446
https://homoefficio.github.io/2015/07/27/%EC%9E%AC%EA%B7%80-%EB%B0%98%EB%B3%B5-Tail-Recursion/
< for문을 재귀로 표현할 수도 있음 >
for(let i=0; i<3; i++) {
console.log('hi)
}
▼
function printHello(count) {
if(count === 0) {
return;
}
console.log('hi');
debugger;
printHello(count - 1)
}
printHello(3)
! recursion과제 슈도코드로 팁 알려주셨다, 참고해서 과제 고고 !
function getElementByClassName(calssName ) {
let fount = [];
let rootElement = document.body;
function recursion(className, parentElement) {
// parentElement의 자식 엘리먼트 중에 className이 있느냐?
for() {
if() {
// 있으면, 해당 엘리먼트를 found에 넣는다
} else {
// 없으면, 해당 엘리먼트의 자식들까지(children) 다 찾는다
// 예시) recurtion(className, parentElement[0])
}
}
}
recursion(className, parentElement);
}