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),执行流程会变成这样:
- 初始
n=5,不满足if条件,进入循环 - 第一次循环:
i=1满足1<5,执行n *=1后n还是5,i++变成2 - 第二次循环:
i=2满足2<5,执行n *=2后n=10,i++变成3 - 第三次循环:
i=3满足3<10,执行n *=3后n=30,i++变成4 - 第四次循环:
i=4满足4<30,执行n *=4后n=120,i++变成5 - 接下来
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):
- 初始
i=4满足4>=1,n=5*4=20,i--变成3 i=3满足条件,n=20*3=60,i--变成2i=2满足条件,n=60*2=120,i--变成1i=1满足条件,n=120*1=120,i--变成0- 此时
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
相关产品推荐
相关产品推荐

