当前位置:首页 > 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)迭代计算阶乘,避免递归可能导致的栈溢出问题。

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

说明

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

尾递归优化实现

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

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实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现跳转

js实现跳转

使用 window.location 跳转 通过修改 window.location.href 实现页面跳转,这是最常用的方法。 window.location.href = 'https://…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的H…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…