재귀 : 자신을 정의할 때 자기 자신을 호출하는 방법
const countdown = n => {
console.log(n);
countdown(n-1);
}
countdown(10); // 10에서 시작해서 무한으로 마이너스 값까지 내려감
재귀함수는 아래의 절차가 꼭 필요하다.
"언제 멈출 것인가?"
위를 고려해 0이 되면 더 이상 재귀를 이어나가지 않도록 종료 조건을 추가해야한다.
const countdown = n => {
console.log(n);
if (n===0) return;
countdown(n-1);
}
countdown(10);

factorial 로직은 맞지만, store 변수를 생성할 필요가 없으므로 가독성을 위해 삭제한다.
const factorial = n => {
if (n === 1) return 1;
return n * factorial(n - 1);
}

하나를 왜 통과하고 있지 못하는지 고민하다가...
n이 0인 경우를 방어하지 못했다는 것을 깨닫고 test 돌렸더니 통과했다


스택(stack)은 자료의 입출력이 언제나 목록의 한 쪽 끝에서만 일어나는 선형구조이며, 가장 나중에 들어간 자료(push)가 가장 먼저 나온다(pop).
즉, LIFO(Last In First Out)입니다.
재귀 함수를 사용하면 함수의 호출이 스택에 쌓이게 되고, LIFO로 값을 반환하기 전까지 메모리 공간을 차지하고 있습니다. 즉 재귀함수를 사용하는 것보다 반복문을 사용했을 때 성능이 더 좋은 경우가 많습니다.