使用递归计算阶乘

一、普通的递归

一般写递归都会这么写

    // 阶乘
    function factorial_1(num) {
        return (num == 1 ? num : num * factorial_1(num - 1));
    }
    var fac = factorial_1;
    factorial_1=null;
    console.log(fac(2)); // 
    console.log(fac(3)); // 
    console.log(fac(4)); // 

将 factorial_1 赋给 fac ,如果没有 factorial_1 = null 这行代码,不会出现任何的问题,但是一旦有的这行代码就会出现错误:

1-1.jpg

因为在递归函数内部,使用的是 factorial_1(num - 1) 一旦将 factorial_1 置为 null , 则在递归调用自身之后就出现了问题.

二、非严格模式下的解决方式:

如果不是严格模式 , 使用 arguments.callee(num - 1) 来替代 factorial_1 (num - 1) 调用自身,可以正常使用。

    // 阶乘 使用arguments.callee
    function factorial(num) {
        return (num == 1 ? num : num * arguments.callee(num - 1));
    }
    var newFactorial = factorial;
    factorial_1=null;
    console.log(newFactorial(1)); // 1
    console.log(newFactorial(3)); // 6

三、严格模式下

严格模式下是无法使用 arguments 的,可以借助命名的函数表达式来实现。命名函数表达式和匿名函数表达式的最大不同就是有名字。。。。

有函数名就可以调用这个函数表达式。

    // 阶乘 使用命名函数表达式
    var factorial2 = (function f(num) {
        return (num == 1 ? num : num * f(num - 1));
    });
    var newFactorial = factorial2;
    console.log(newFactorial(1)); // 1
    console.log(newFactorial(3)); // 6