재귀 함수
함수는 함수 안에서 자기 자신을 다시 호출하는 것을 재귀함수라고 한다.
재귀 함수의 필요성과 특징에 대해 알아보도록 하자.
재귀함수는 대개 factorial(계승) 함수로 설명들을 하고 있다.
다음 코드를 보자.
JavaScript
function fakeFactorial(n) {
var result = 1;
for(var i = 1; i <= n; i++) {
result *= i;
}
return result;
}
console.log(fakeFactorial(3)); // 3 * 2 * 1 = 6
console.log(fakeFactorial(4)); // 4 * 3 * 2 * 1 = 24
// 재귀를 이용한 factorial(계승) 함수
function factorial(n) {
if(n == 0 || n == 1) {
return 1;
}
return n * factorial(n -1); // 자기 자신을 다시 호출
// 파라미터가 3이라면 3 * factorial(2) * factorial(1)
}
console.log(factorial(3);
// 삼항 연산자를 이용한 계승 재귀함수
function fact(n) {
return (n > 1) ? n * fact(n -1) : 1;
}
console.log(fact(5)); // 120
위의 두번째 함수와 같이 자기 자신을 다시 호출하여 사용하는 것을 재귀 함수라고 한다.
또 다른 예제를 통해 사용법에 대해 좀 더 알아보자.
JavaScript
var sports = {
soccer : {member: 11, time: 90},
basketball : {member: 5, time: 48}
};
function showValues(sports) {
var type, obj, name;
for(type in sports) {
obj = sports[type];
for (name in obj) {
console.log(name + " : " + obj[name]);
}
}
}
showValues(sports);
/*
* 실행 결과 *
member : 11
time : 90
member : 5
time: 48
*/
위의 예제는 객체의 key : value를 출력하는 예제이다. sports란 객체에는 또 다른 객체를 포함하고 있는 계층적인 객체구조를 이루고 있다.
하지만 여기서 soccer 객체의 soccer.meber의 값이 11이 아닌 {step : {value: 11}}의 형태인 계층적 객체를 또 포함하고 있다면 이 객체의 프로퍼티를 열거하기 위해 또 한번의 for-in문을 작성해야 한다.
그런데 이런 계층적인 객체에 맞추어 코드를 유동적으로 작성할 수는 없다. 이럴 경우에 재귀함수를 사용하여 해결할 수가 있다.
재귀함수를 사용하여 계층적인 객체 프로퍼티를 열거
JavaScript
var sports = {
soccer : {step: {value : 11}, time: 90},
basketball : {member: 5, time: 48}
};
function showValues(sports) {
var type, obj;
for(type in sports) {
obj = sports[type];
typeof obj === "object" ? showValues(obj) : console.log(type + " : " + obj);
}
}
showValues(sports);
/*
* 실행 결과 *
value : 11
time : 90
member : 5
time: 48
*/
이와 같은 처리로 객체의 프로퍼티를 전부 열거할때까지 반복합니다.
따라서 객체의 계층에 제약을 받지 않고 처리할 수가 있습니다
또 다른 예제
JavaScript
var countDown = function countDown(num) {
console.log(num);
num--;
if(num <= 0 ) {
return false;
}
countDown(num);
};
countDown(5);
Jaehee's WebClub
'JavaScript > JS 활용 & etc..' 카테고리의 다른 글
함수 선언문과 함수 표현식에서의 세미콜론(;) (0) | 2016.09.29 |
---|---|
자바스크립트 메서드 오버라이드와 오버로딩 (6) | 2016.09.29 |
팩토리얼 함수 (0) | 2016.09.29 |
정렬 알고리즘(선택정렬) - 오름차순,내림차순 (0) | 2016.09.29 |
배열의 합, 최대값,최소값 알고리즘 (0) | 2016.09.29 |