一、什么是函数的递归
函数反复调用自己,直到最终结果,跳出
var n = 0;
shownumber();
function shownumber() {
n += 1;
if (n === 10000) {
console.log(n);
return;
}
shownumber();
}
二、举例
例1:递归阶乘函数
function factorial(num){
if(num<=1){
return 1;
}
else{
return num*factorial(num-1);
}
}
问题1:以上函数表面看起来没有问题,但下面代码会导致其出错,例:
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(3)); //出错
以上代码先把factorial()函数保存在变量anotherFactorial中,然后将factorial变量设置为null,结果指向原始函数的引用只剩下一个。但在接下来调用anotherFactorial()时,由于必须执行factorial(),而factorial已经不再是一个函数,就会导致错误。因此,需用arguments.callee,即一个指向正在执行的函数的指针,可以用它来实现函数的递归调用,例:
function factorial(num){
if(num<=1){
return 1;
}
else{
return num*arguments.callee(num-1);
}
}
问题2:在严格模式下,不能通过脚本访问arguments.callee,访问这个属性会导致错误。因此,可使用命名函数表达式来达成相同结果,例:
var factorial=(function f(num){
if(num<=1){
return 1;
}
else{
return num*f(num-1);
}
});
var anotherFactorial=factorial;
factorial=null;
alert(anotherFactorial(4));
以上代码创建了一个名为f()的命名函数表达式,然后将它赋值给变量factorial。即便把函数赋值给了另一个变量,函数的名字f仍然有效。
例2:5的n!
function jiecheng(n) {
if (n == 0) {
return 1;
}
return jiecheng(n - 1) * n;
}
console.log(jiecheng(5));
//f(3)=f(2)*3; f(3)=1*1*2*3
//f(2)=f(1)*2;
//f(1)=f(0)*1
例3:Fibonacci数列 1,1,2,3,5,8,13,21
当前位的值
var fib = function (n) {
if (n <= 2) {
return 1;
}
return fib(n - 2) + fib(n - 1);
}
console.log(fib(3));
//fib(3) fib(1)+fib(0)+fib(1)
//fib(2) fib(1)+fib(0)
例4:1-100之和
function f1(x) {
if (x <= 0) {
return 0;
}
return x + f1(x - 1);
}
console.log(f1(100));