javascript递归算法计算一个数的阶乘

计算一个整数的阶乘

如果用字母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);

12月4日更新

使用函数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也可以正常计算阶乘。

第一次写东西,markdown用的还不太熟练。希望以后能再好一点。本篇文章若有纰漏之处,欢迎指出。
    原文作者:少年vv
    原文地址: https://www.jianshu.com/p/74374e8bb6b9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞