美文网首页
阶乘算法

阶乘算法

作者: Joe_Somebody | 来源:发表于2017-04-07 23:14 被阅读0次

    如果用字母n来代表一个整数,阶乘代表着所有小于或等于n的整数的乘积。

    阶乘通常简写成 n!

    例如:

    5! = 1 * 2 * 3 * 4 * 5 = 120
    

    代码如下,使用递归思想,

    function factorialize(num) { 
       return (num * factorialize(num - 1));
    }
    

    在函数内部继续调用。但是这样会无限递归下去,比如

    5 * 4 * 3 * 2 * 1 * 0 * -1 * -2 ...
    

    所以加上限定条件

    function factorialize(num) { 
      if (num>0) {
        return (num * factorialize(num - 1));
    }    
    

    但是这样会输出

    null
    

    原来是

    factorialize(5)*factorialize(4)*factorialize(3)*factorialize(2)*factorialize(1)
    

    factorialize(1)并没有值。

    所以再加上

    function factorialize(num) {
      if (num>0)
      {return (num * factorialize(num - 1));}
      else
      return (1);
    }
    

    num=1的时候,factorialize(1)=1,所以可以正确计算出结果。

    结果为

    factorialize(5)*factorialize(4)*factorialize(3)*factorialize(2)*factorialize(1)
    

    并且factorialize(1)=1

    总结一下代码

    function factorialize(num) {
      if (num>0)
        {return (num * factorialize(num - 1));}
      else
      return (1);
    }
    
    factorialize(5);
    

    进化版

    使用函数arguments.callee属性解耦

    arguments有一个名叫callee属性,该属性是一个指针,指向拥有arguments对象的函数。
    原函数的执行与函数factorialize紧紧耦合到了一起,这不优雅,所以可以使用arguments.callee属性解耦

    function factorialize(num) {
      if (num>0) {
        return (num * arguments.callee(num - 1));
      } else {return (1);}
    }
    

    这样无论引用函数使用什么名字,都可以正常递归,例如

    var trueFactorialize = factorialize;
    factorialize = function () {
      return 0;
    };
    console.log(trueFactorialize(5)); //120
    console.log(factorialize(5)); //0
    

    即使factorialize变了,trueFactorialize也可以正常计算阶乘。

    相关文章

      网友评论

          本文标题:阶乘算法

          本文链接:https://www.haomeiwen.com/subject/mjmkattx.html