复合循环迭代次数疑问:为何内层递减循环结果为250×499?
嵌套循环迭代次数的数学解释
先看你给出的两段代码,第一段两层循环都遍历500次,总次数是500×500=250000,这个逻辑很好理解。
第二段的内层循环j从i+1开始,我们拆解每次外层循环对应的内层执行次数:
- 当
i=0时,j要跑1到499,共499次 - 当
i=1时,j跑2到499,共498次 - ...
- 当
i=498时,j只跑499,共1次 - 当
i=499时,j从500开始,不满足条件,0次
把这些次数加起来,就是求1+2+...+499的和(0可以忽略)。这里用等差数列求和公式:从1到n的连续整数和为n×(n+1)/2?不对,这里n是499,所以总和是499×500/2。计算时500除以2等于250,式子就变成了250×499,结果正好是124750,和代码运行结果一致。
换个实际场景的角度看,你要实现“两两比较一次不重复”,本质就是从500个元素里选2个不重复的组合,组合数公式是C(n,2) = n×(n-1)/2,代入n=500就是500×499/2=250×499,这和前面的求和结果完全对应——每一组(i,j)(i<j)正好对应一次比较,没有重复计算。
附上修正后的代码:
let num_1 = 0; for(let i = 0; i < 500; i++){ for(let j = 0; j < 500; j++){ num_1++; } } console.log(num_1); // 500*500 = 250,000 let num_2 = 0; for(let i = 0; i < 500; i++){ for(let j = i+1; j < 500; j++){ num_2++; } } console.log(num_2); // 250×499 = 124,750
内容的提问来源于stack exchange,提问作者Alexander Mills
相关产品推荐
相关产品推荐

