美文网首页
阶乘算法

阶乘算法

作者: 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