阶乘算法

如果用字母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也可以正常计算阶乘。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容