본문으로 바로가기

재귀 함수(Recursive Function)

category JavaScript/JS 활용 & etc.. 2016. 9. 29. 13:00


재귀 함수

함수는 함수 안에서 자기 자신을 다시 호출하는 것을 재귀함수라고 한다.

재귀 함수의 필요성과 특징에 대해 알아보도록 하자.

재귀함수는 대개 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