재귀호출(recursive call)
함수가 자기자신을 호출하는 것
function countdown(n) {
for (var i = n; i >= 0; i--) console.log(i);
}
countdown(10)
function countdown(n) {
if (n < 0) return;
console.log(n);
countdown(n - 1); //재귀호출
}
countdown(10);
팩토리얼(계승)
1부터 자기자신까지 모든 양의 정수의 곱
n! = n*(n-1)*(n-2)*...*3*2*1
function factorial(n) {
//탈출 조건: n이 1 이하일 때 재귀 호출을 멈춘다.
if (n <= 1) return 1;
// 재귀 호출
return n * factorial(n-1);
}
console.log(factorial(0));
console.log(factorial(1));
console.log(factorial(2));
console.log(factorial(3));
console.log(factorial(4));
console.log(factorial(5));
함수이름 -> 함수내부에서 유효 -> 함수내부에서 함수이름(자신) 사용 -> 자기자신 호출
함수표현식으로 정의한 함수 -> 식별자로도 재귀호출가능
var factorial = function foo(n) {
if (n <= 1 ) return 1; //n이 1 이하일때 1리턴 (실행종료 후 값 1 반환)
return n * factorial(n - 1);
//함수를 가리키는 식별자로 자기자신 호출
};
console.log(factorial(5));
var factorial = function foo(n) {
if (n <= 1 ) return 1;
console.log(factorial === foo); //true 똑같다
return n * foo(n - 1);
//함수이름으로 자기자신 호출
};
console.log(factorial(5));
console.log(factorial === foo)
4번 실행 후 5번째 실행에서 반환return 1;
으로 인해 실행 안됨 -> 리턴발생시 이후의 문은 무시한다, 함수는 return하면 휘발된다
ex) k=1 N=3일 경우 1에서~3을 2k 에 대입한 모든 값들의 합 ( 2 + 4 + 6 = 12 )
일 경우
function sigma(n){
if(n <= 1) {
return n
}
return n + sigma(n-1)
}
function fib(n){
if(n <= 2) {
return n
}
return n + sigma(n-1)
}
undefined
function fib(n){
if(n <= 2) {
return n
}
return fib(n-1) + fib(n-2)
}
뭔가 이상... fib(0) =0
더 알아볼것
cache, 피보나치수 만들기
반복문보다 재귀함수를 썼을때 이해가 쉬울때만 한정적으로 사용하길 권장
참고서적: 모던자바스크립트 DeepDive
참고사이트: 모던자바스크립트 튜토리얼