美文网首页
写一个函数,返回一个数组中所有元素被第一个元素除的结果

写一个函数,返回一个数组中所有元素被第一个元素除的结果

作者: oh_flying | 来源:发表于2022-06-08 23:24 被阅读0次

    首先这个是在看《编程之美》这本书的时候看到的题目,书中提到的方法是写了个反向循环,也就是从最后一个数一次除以第一个数,获取到答案,书中也说了,正向的是个陷阱,我一时没想明白,后面写了一遍,仔细思考了下,觉得确实有问题,现在记录一下。
    先来个错误的写法,也就是正向循环,使用js实现,其实任何语言都大同小异。

    function test (array, size) {
        for (let i = 0; i < size; i++) {
            //array[i] /= array[0]
            array[i] = array[i] / array[0] //这个写法就是上面展开后的写法
            console.log(array[i],array[0])
        }
    }
    const a = [2,3,4,2,18,20]
    const b = 6
    test(a, b)
    
    打印结果
    可以看出除了第一个结果求的结果正确以外,其他的都是原来的数值,这个原因就是因为,第一次循环完之后,array[0]变为了1,为啥呢?就因为array[i] = array[i] / array[0]这行代码,这个第一次计算的结果就是array[0] = array[0] / array[0],所以array[0]的值变为了1,因此后面的所有与它相除都等价与除以个1
    正确的写法,用倒循环可以解决,也可以在正循环中加一个变量,当个中间值,当然严谨一点还需要考虑第一个值为0的情况,也还有一些其他边界条件,感兴趣可以自己再想想。
    给出一个书上的解法,没有判断为0的情况:
    function test (array, size) {
        for (let i = size-1; i >= 0; i--) {
            // array[i] /= array[0]
            array[i] = array[i] / array[0]
            console.log(array[i],'-----------',array[0])
        }
    }
    const a = [2,3,4,2,18,20]
    const b = 6
    test(a, b)
    
    打印结果

    这个题目本身不难,主要就是想说明一下为啥正向循环有问题,网上搜了下,感觉都是相互抄的,也没有具体解释,我就手把手解释一下,我自己比较笨,所以就一点一点分析一下。

    相关文章

      网友评论

          本文标题:写一个函数,返回一个数组中所有元素被第一个元素除的结果

          本文链接:https://www.haomeiwen.com/subject/izepmrtx.html