递归函数:一个函数通过名字调用自身的情况构成的。eg:
1 //递归实现阶乘 2 function factorial(num){ 3 if(num <= 1){ 4 return 1; 5 }else{ 6 return num * factorial(num - 1); 7 } 8 } 9 10 console.log(factorial(4));//24
# 正常情况下,以上函数是没有问题的,但是如果出现以下操作,会出现问题。原因是即使先把factorial保存到anotherFactorial变量后,再将factorial置为null,但是当我们在调用anotherFactorial的时候,在函数内部,还是需要调用factorial(num - 1),所以报错。
1 function factorial(num){ 2 if(num <= 1){ 3 return 1; 4 }else{ 5 return num * factorial(num - 1); 6 } 7 } 8 9 var anotherFactorial = factorial; 10 factorial = null; 11 console.log(anotherFactorial(4));//报错 :Uncaught TypeError: factorial is not a function
# 可以使用arguments.callee 解决以上问题。arguments.callee 是一个指向正在执行的函数的指针,可以用它来实现函数的递归调用。
1 function factorial(num){ 2 if(num <= 1){ 3 return 1; 4 }else{ 5 return num * arguments.callee(num - 1); 6 } 7 } 8 9 var anotherFactorial = factorial; 10 factorial = null; 11 console.log(anotherFactorial(4));//24
# 但是严格模式下,不能通过脚本访问arguments.callee 所以会报错:Uncaught TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them..
# 可以使用命名函数表达式实现以上效果,在严格模式和非严格模式都可以实现。
1 var factorial = (function f(num){ 2 if(num <= 1){ 3 return 1; 4 }else{ 5 return num * f(num-1); 6 } 7 }); 8 9 var anotherFactorial = factorial; 10 factorial = null; 11 console.log(anotherFactorial(4));//24
#
请实现一个fibonacci函数,要求其参数和返回值如下所示:
/**
*@desc: fibonacci
*@param: count {Number}
*@return: result {Number} 第count个fibonacci值,计数从0开始
fibonacci数列为:[1, 1, 2, 3, 5, 8, 13, 21, 34 …]
则getNthFibonacci(0)返回值为1
则getNthFibonacci(4)返回值为5
*/
1 var fib = (function fun(count){ 2 if(isNaN(count) || count < 0){ 3 return 0; 4 }else{ 5 if(count <= 1){ 6 return 1; 7 }else{ 8 return fun(count-1) + fun(count - 2); 9 } 10 } 11 }); 12 console.log(fib(0));//1 13 console.log(fib(4));//5