当前位置:首页 > JavaScript

js 实现阶乘

2026-02-01 14:39:33JavaScript

递归实现

递归是计算阶乘最直观的方法之一。递归函数会不断调用自身,直到达到基本情况(通常是 n === 0n === 1)。

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

循环实现

使用循环可以避免递归可能导致的堆栈溢出问题,尤其是在计算大数阶乘时。

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

尾递归优化

尾递归是一种优化递归的方式,可以避免堆栈溢出。但需要注意的是,JavaScript 引擎不一定支持尾调用优化(TCO)。

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

使用 BigInt 处理大数

JavaScript 的 Number 类型有精度限制,对于大数阶乘(如 n > 20),可以使用 BigInt 避免精度丢失。

js 实现阶乘

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

性能比较

  • 递归实现简洁但可能导致堆栈溢出。
  • 循环实现性能较好,适合大多数场景。
  • 尾递归优化在支持 TCO 的环境中表现优异。
  • BigInt 适合处理大数阶乘,但会牺牲部分性能。

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

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现继承

js实现继承

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

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div cl…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现日历

js实现日历

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