재귀함수, arguments.callee

함수안에서 자신을 다시 부를 수 있다.
흔히 재귀함수라고 하는것인데.

factorial(팩토리얼) 알고리즘을 예로 들어 설명한다.

‘팩토리얼 5’의 결과값은 120이다.

5 x 4 x 3 x 2 x 1 = 120

수식은 자신’5’부터 ‘1’까지 1씩 줄여가며 곱하는 것이다

이제 이것을 함수 이름으로 선언하면

function factorial (x) {
 if (x <= 1) 
 return 1;

 return x * factorial(x - 1);
}

함수 리터럴로 선언하면

var factorial = function(x) {
 if (x <= 1) 
 return 1;

 return x * factorial(x - 1);
}

그런데 만약 함수리터럴에서 다른이름으로 할당한다면 어떻게 될까 ?

factorial(5); // 120  기존함수
var fact = factorial; // 새 변수에 기존함수 할당
factorial = null; // 기존 함수 제거

fact(5); // error!!

fact 함수안에서 자신이 아닌 factorial을 부르고 있기때문에 자신을 찾을 수가 없다.

함수의 이름을 사용하지 말고 arguments.callee 를 사용해 자신을 불러보자.

var factorial = function(x) {
 if (x <= 1) 
 return 1;

 return x * arguments.callee(x - 1); // 자기자신을 부름
}

이렇게 되면 같은 과정을 거쳐 할당을 해도 작동을 한다.

factorial(5); // 120  기존함수
var fact = factorial; // 새 변수에 기존함수 할당
factorial = null; // 기존 함수 제거

fact(5); // 120 정상작동
Total Views: 944 ,

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.