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

首先这个是在看《编程之美》这本书的时候看到的题目,书中提到的方法是写了个反向循环,也就是从最后一个数一次除以第一个数,获取到答案,书中也说了,正向的是个陷阱,我一时没想明白,后面写了一遍,仔细思考了下,觉得确实有问题,现在记录一下。
先来个错误的写法,也就是正向循环,使用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)
打印结果

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

你可能感兴趣的:(写一个函数,返回一个数组中所有元素被第一个元素除的结果)