当前位置:首页 > JavaScript

js实现阶乘

2026-02-01 16:15:47JavaScript

递归实现阶乘

递归是一种常见的阶乘实现方式,通过函数调用自身逐步分解问题。

function factorialRecursive(n) {
  if (n === 0 || n === 1) {
    return 1;
  }
  return n * factorialRecursive(n - 1);
}

说明

  • 基线条件为 n === 0n === 1,此时直接返回 1
  • 递归调用 n * factorialRecursive(n - 1) 逐步计算乘积。

循环实现阶乘

通过循环(如 forwhile)迭代计算阶乘,避免递归可能导致的栈溢出问题。

js实现阶乘

function factorialIterative(n) {
  let result = 1;
  for (let i = 2; i <= n; i++) {
    result *= i;
  }
  return result;
}

说明

  • 初始化 result1,从 2 开始遍历到 n
  • 每次迭代将当前值 iresult 相乘。

尾递归优化实现

尾递归优化可避免递归的栈溢出问题,但需确保 JavaScript 引擎支持(如严格模式)。

js实现阶乘

function factorialTailRecursive(n, accumulator = 1) {
  if (n === 0 || n === 1) {
    return accumulator;
  }
  return factorialTailRecursive(n - 1, n * accumulator);
}

说明

  • 使用 accumulator 参数保存中间结果,减少调用栈开销。
  • 需在严格模式下运行('use strict')以启用优化。

使用 reduce 实现

利用数组的 reduce 方法简洁实现阶乘。

function factorialReduce(n) {
  return Array.from({ length: n }, (_, i) => i + 1)
    .reduce((acc, val) => acc * val, 1);
}

说明

  • Array.from 生成 [1, 2, ..., n] 的数组。
  • reduce 方法累乘所有数组元素,初始值为 1

性能与注意事项

  • 递归:代码简洁,但大数值可能导致栈溢出(如 n > 10000)。
  • 循环:性能稳定,适合大数值计算。
  • 尾递归:需引擎支持,否则与普通递归无异。
  • 边界处理:建议添加对负数或非整数的校验(如抛出错误)。
function factorialSafe(n) {
  if (n < 0 || !Number.isInteger(n)) {
    throw new Error('Input must be a non-negative integer');
  }
  return factorialIterative(n); // 选择上述任一实现
}

标签: 阶乘js
分享给朋友:

相关文章

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js 实现分页

js 实现分页

实现分页的基本逻辑 分页功能通常需要后端返回数据总量或总页数,前端根据当前页码和每页条数截取对应数据。以下是一个基于JavaScript的简单分页实现方案: 前端分页实现 假设已有从后端获取的完整数…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…