You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript阶乘函数为何仅支持递减循环?递增循环失效排查

问题分析:递增循环阶乘函数的无限循环问题

你遇到的问题核心是在递增循环里修改了循环条件依赖的变量n,导致循环永远无法终止。我们来一步步拆解原因:

出问题的递增循环代码分析

先看你写的这段无法运行的代码:

function factorial(n) { 
  if (n == 0 || n == 1) { 
    return 1; 
  } 
  for (var i = 1; i < n; i++) { 
    n *= i; 
  } 
  return n; 
}

假设调用factorial(5),执行流程会变成这样:

  1. 初始n=5,不满足if条件,进入循环
  2. 第一次循环:i=1满足1<5,执行n *=1后n还是5,i++变成2
  3. 第二次循环:i=2满足2<5,执行n *=2后n=10,i++变成3
  4. 第三次循环:i=3满足3<10,执行n *=3后n=30,i++变成4
  5. 第四次循环:i=4满足4<30,执行n *=4后n=120,i++变成5
  6. 接下来i=5,此时n=120,5<120依然成立,循环继续——n会越来越大,i永远追不上不断增长的n,直接陷入无限循环,自然不会返回结果!

为什么递减循环能正常工作?

再看你的可运行代码:

function factorial(n) { 
  for (var i = n - 1; i >= 1; i--) { 
    n *= i; 
  } 
  return n; 
}

这里的循环条件依赖的是i,而i是从n-1开始独立递减的,完全不受n变大的影响。比如调用factorial(5):

  1. 初始i=4满足4>=1,n=5*4=20,i--变成3
  2. i=3满足条件,n=20*3=60,i--变成2
  3. i=2满足条件,n=60*2=120,i--变成1
  4. i=1满足条件,n=120*1=120,i--变成0
  5. 此时i=0不满足i>=1,循环终止,正常返回n=120。

修复后的递增循环阶乘函数

要让递增循环正常工作,关键是不要修改循环条件里用到的原始变量,可以用一个单独的变量保存计算结果:

方案1:保留你的循环逻辑,用独立结果变量

function factorial(n) {
  if (n === 0 || n === 1) {
    return 1;
  }
  let result = n; // 用result存计算结果,不改动原始n
  for (let i = 1; i < n; i++) {
    result *= i;
  }
  return result;
}

方案2:更直观的递增循环(贴合阶乘定义)

这种写法更符合n! = 1×2×…×n的定义,可读性更高:

function factorial(n) {
  if (n === 0 || n === 1) {
    return 1;
  }
  let result = 1;
  for (let i = 2; i <= n; i++) {
    result *= i;
  }
  return result;
}

这两种写法都能避开无限循环,正常返回阶乘结果。

内容的提问来源于stack exchange,提问作者maraxai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 07:32:30