10 이내의 팩토리얼을 시도해 보겠습니다.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>js中递归函数的使用</title> <script type="text/javascript"> function f(num){ if(num<1){ return 1; }else{ return f(num-1)*num; } } </script> </head> <body> <script type="text/javascript"> alert("10!的结果为:"+f(10)); </script> </body> </html>
재귀 함수 호출은 여기까지입니다.
js 재귀 함수가 자신을 호출할 때의 보험 방법.
js 고급 프로그래밍에서
일반적인 계승 재귀 함수:
function fact(num){ if (num<=1){ return 1; }else{ return num*fact(num-1); } }
다음 코드는 오류를 일으킬 수 있습니다.
var anotherFact =fact
fact = null ;
alert(antherFact(4)); //오류
fact가 더 이상 함수가 아니기 때문에 오류가 발생했습니다.
실행 중인 함수에 대한 포인터인args.callee를 사용하면 문제를 해결할 수 있습니다.
새 함수는 다음과 같습니다.
function fact(num){ if (num<=1){ return 1; }else{ return num*arguments.callee(num-1); //此处更改了。 } } var anotherFact = fact; fact = null; alert(antherFact(4)); //结果为24.
JS 일반 재귀 개선
재귀 함수는 아래와 같이 함수가 이름으로 자신을 호출할 때 형성됩니다.
function factorial(num) { if(num<=1) { return 1; } else { return num * factorial(num-1); } }
이것은 고전적인 계승 함수입니다. 겉으로는 아무런 문제가 없어 보이지만, 다음 코드를 실행하면 문제가 발생할 수 있습니다.
var anotherFactory = 계승;
anotherFactorial(4); //출력 24
factorial = null
anotherFactorial;
(4); //TypeError: 객체 [object Window]의 'factorial' 속성은
함수 크롬에서 테스트
그 이유는 우리가 정의한 함수 이름이 실제로는 함수를 가리키는 포인터인데 이때 anotherFacttorial이 정의되어 있기 때문입니다.
또한 해당 함수를 가리키므로 anotherFactory(4)를 호출하면 24를 성공적으로 출력할 수 있습니다.
이때 Factorial = null;
그러면 실행 정의 함수에 대한 참조는 anotherFactorial이고 anotherFactorial(4) 호출 시 위의 오류 메시지가 표시됩니다.
이때 인수.callee를 사용하여 함수 정의에서 팩토리얼을 대체할 수 있습니다.
함수 정의는 다음과 같습니다.
function factorial(num) { if(num<=1) { return 1; } else { return num * arguments.callee(num-1); } }
그런 다음 위의 4줄의 테스트 코드를 사용합니다. 마지막 줄 테스트 코드에서도 24가 성공적으로 출력됩니다.