首先这个是在看《编程之美》这本书的时候看到的题目,书中提到的方法是写了个反向循环,也就是从最后一个数一次除以第一个数,获取到答案,书中也说了,正向的是个陷阱,我一时没想明白,后面写了一遍,仔细思考了下,觉得确实有问题,现在记录一下。
先来个错误的写法,也就是正向循环,使用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)
打印结果
这个题目本身不难,主要就是想说明一下为啥正向循环有问题,网上搜了下,感觉都是相互抄的,也没有具体解释,我就手把手解释一下,我自己比较笨,所以就一点一点分析一下。
网友评论