for循环的坑

  • 今天在练习一个分解质因数的算法
// 判断这个因数是否是质因数
function isPrime (num) {
    let f = true
    for (let i = 2; i < Math.floor(num / 2); i++) {
        if (num % i === 0) {
            f = false
            break;
        }
    }
    return f;
}

let n = 180
// 存放质因数的数组
let arr = []

// 分解质因数
function divide (num) {
    for (let i = 2; i <= Math.floor(num / 2); i++) {
        // 如果是质因数就保存下来
        if (num % i === 0 && isPrime(i)) {
            arr.push(i)
            num = num / i;
            i--
            continue
        }
    }
}

divide(n)
console.log(arr);

是不是乍一看感觉能得到质因数。那么恭喜你,你成功踩到坑里了。这个程序的输出结果是这个样子滴


质因数

是不是发现少了点什么,没错,就是少了最后一个质因数5。笔者多次尝试发现总是少最后一个质因数,反复阅读程序认为逻辑没有错误。但作为一个被JS作用域折磨已久的菜鸡,总觉得是for循环的判断条件那出问题了。于是写了个demo测试了下

let arr = [1, 2, 3, 4]
for (let i = 0; i < arr.length; i++) {
    console.log(i)
    arr.length--
}

正常情况下你是不是认为应该输出0,1,2,3。但结果却是这个样子的

动态改变for循环的判断条件

我们本来以为for循环应该循环arr.length也就是4次,但结果却是循环了两次,这就意味着for循环里的( ; ; )判断条件是动态变化的(我之前一直以为是不变的233333)。具体为什么变化我觉得可能和JS特有的作用域链有关吧,笔者也没有研究过底层,望知道底层原理的大佬可以分享下。最后放一个改进的分解质因数的程序

// 判断这个因数是否是质因数
function isPrime (num) {
    let f = true
    for (let i = 2; i < Math.floor(num / 2); i++) {
        if (num % i === 0) {
            f = false
            break;
        }
    }
    return f;
}

let n = 180
// 存放质因数的数组
let arr = []
// 质因数的最大判断条件
let base = Math.floor(n / 2)

// 分解质因数
function divide (num) {
    for (let i = 2; i < base; i++) {
        // 如果是质因数就保存下来
        if (num % i === 0 && isPrime(i)) {
            arr.push(i)
            num = num / i;
            i--
            continue
        }
    }
}

divide(n)
console.log(arr);
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.假如有如下for循环 请问在2333毫秒之后输出几? 2.for...in 佯谬 https://wdd.js...
    勃王阅读 283评论 0 0
  • Python 语言学习成本低,写出来很像伪代码,可读性高,等等有很多显而易见的优点。相比于其他语言,Python ...
    李涛AT北京阅读 679评论 0 2
  • 记录前两天小程序写的一个bug 背景:循环数组,满足条件退出循环, 使用了forEach循环,后来发现不会跳出,百...
    ccc往事随风阅读 101评论 0 0
  • 感觉全世界都是在用ARC,而我还在MRC里挣扎。摊手.jpg 先看看这个crash 重现步骤是制造弱网络环境,清除...
    没梦想的咸鱼2阅读 2,415评论 0 50
  • 年轻就是耐不住,耐不住一颗躁动的心,5分钟刷一次朋友圈,10分钟刷一次抖音,一次刷上一个钟头。看到好友们在喝酒蹦迪...
    6爷万岁阅读 540评论 0 0

友情链接更多精彩内容