当前位置:首页 > JavaScript

js实现n的阶乘

2026-04-04 19:28:30JavaScript

递归实现

递归是计算阶乘最直观的方法,利用函数调用自身的方式实现。

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 factorialLoop(n) {
  let result = 1;
  for (let i = 2; i <= n; i++) {
    result *= i;
  }
  return result;
}

说明

  • 初始化 result1,从 2 开始累乘到 n
  • 时间复杂度为 $O(n)$,空间复杂度为 $O(1)$。

尾递归优化

某些 JavaScript 引擎支持尾调用优化(TCO),可优化递归性能。

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

说明

  • 通过 accumulator 参数保存中间结果,避免递归栈堆积。
  • 需确认运行环境是否支持 TCO(如 Safari)。

大数处理(BigInt)

n 较大时(如 n > 20),使用 BigInt 避免精度丢失。

function factorialBigInt(n) {
  let result = 1n; // BigInt 字面量
  for (let i = 2n; i <= BigInt(n); i++) {
    result *= i;
  }
  return result;
}

说明

js实现n的阶乘

  • BigInt 类型通过后缀 nBigInt() 构造函数定义。
  • 适用于计算超大数阶乘(如 n = 1000)。

性能对比

  • 递归:代码简洁,但可能栈溢出(如 n > 10000)。
  • 循环:性能稳定,适合大多数场景。
  • BigInt:解决大数问题,但需兼容性检查。

根据需求选择合适的方法,常规场景推荐循环实现。

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

相关文章

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现交换

js实现交换

交换变量的方法 在JavaScript中,交换两个变量的值有多种方法。以下是常见的几种实现方式: 使用临时变量 通过引入一个临时变量来存储其中一个变量的值,实现交换: let a = 1; le…

js实现图片

js实现图片

图片加载与显示 在JavaScript中,可以通过Image对象动态加载图片。创建实例后设置src属性触发加载,通过onload回调处理加载完成后的操作: const img = new Ima…

js实现上传文件

js实现上传文件

文件上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现文件上传功能。 <input type="file"…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js实现图片放大

js实现图片放大

使用 CSS transform 实现图片放大 通过 CSS 的 transform: scale() 属性实现图片放大效果。当鼠标悬停时,图片会平滑放大。 const img = document…