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用的还不太熟练。希望以后能再好一点。本篇文章若有纰漏之处,欢迎指出。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文档内容参考 《JavaScript 闯关记》之函数 函数是一段代码,它只定义一次,但可以被执行或调用任意次。在...
    穿越人海遇见你阅读 4,589评论 0 1
  • 有人说过,很多弯路到最后都成了直路,所有的坑到最后也都成了坦途;所谓的直路和坦途并不是摆在眼前的,都是不断的的...
    老衲法号一眉道人阅读 5,173评论 0 4
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 8,446评论 0 4
  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 4,690评论 0 3
  • 观《夏洛特烦恼》,有人笑,有人哭。 每个人故事不同,每个人哭点不同。很多人在最后马冬梅为夏洛唱《一次就好》的时...
    孑素颜阅读 3,068评论 0 0