JS_高程7.函数表达式(2)递归

递归函数:一个函数通过名字调用自身的情况构成的。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

 

posted @ 2017-08-16 14:54  忍冬。  阅读(202)  评论(0编辑  收藏  举报