因式分解中为何循环除以相同因数?能否用if替代while?
因式分解中循环除以相同因数的原因及替换if的可行性分析
为什么需要循环除以相同因数?
因式分解的核心是把一个数拆解成所有质因数的乘积,而很多数的质因数是重复出现的。比如12的质因数是2、2、3,2出现了两次;18=2×3×3,3出现了两次。
使用while循环的目的,就是把当前能整除被除数的因数彻底除干净——只要被除数还能被这个因数整除,就继续除,同时把这个因数添加到结果数组里,这样才能把所有重复的质因数都收集完整,得到正确的因式分解结果。
举个实际运行的例子,用原函数处理12:
// 原函数执行过程 function Factors(remainder) { var factors = [], i; for (i = 2; i <= remainder; i++) { while ((remainder % i) === 0) { factors.push(i); remainder /= i; } } return factors; } Factors(12); // 返回 [2,2,3],正确分解结果
- 初始remainder=12,i=2,12%2=0,push2,remainder变为6;
- 继续检查6%2=0,再push2,remainder变为3;
- 3%2≠0,退出while循环,i递增到3;
- 3%3=0,push3,remainder变为1,循环结束,得到完整的质因数数组。
把while替换成if可行吗?
完全不可行,得到的结果是错误的。
用修改后的if版本处理12:
// 修改后的函数执行过程 function Factors(remainder) { var factors = [], i; for (i = 2; i <= remainder; i++) { if(remainder%i===0) { factors.push(i); remainder /= i; } } return factors; } Factors(12); // 返回 [2,3],结果缺失了一个2
问题出在if只会对当前因数做一次整除判断:
- 当i=2时,12%2=0,push2后remainder变为6,但if只执行一次,i直接递增到3;
- 后续不会再检查2是否还能整除6,导致漏掉了重复的质因数,最终结果只保留了每个质因数的单次出现,不符合因式分解的要求。
内容的提问来源于stack exchange,提问作者Amir Mohammadzadeh
相关产品推荐
相关产品推荐

