重构此循环,使其执行多个迭代



这里我试图在20*20的网格中找到四个对角相邻的数字,它们的乘积是最大的。对角线从左上到右下。但是第一个循环出了问题:它没有遍历数组。我找不到它是什么。

function fouradjacentFinder(){
let mystring = "08 02 22 97 38 15 ..."
let  myarray  = mystring.split(" ").map(x =>Number(x));
let counter ;
let max = -Infinity;

for(let i = 0;i<myarray.length;i++){
counter= 0 ;
for(let k =21;;k+21 ){
myarray[i] = myarray[i]*myarray[k];
counter++
if(counter>4){
break;
}
if(myarray[i]>max){
max = myarray[i] ;
}
console.log(max)

}
return max;
}
}

几个问题:

  • 您的缩进是关闭的,因此您错过了return语句在for循环中发生的事实:因此它只执行一次迭代。始终正确缩进代码。
  • k+21不修改k。你需要输入k+=21
  • myarray[k]i的值无关,不可能是正确的。要么将i添加到该索引中,要么定义k,使其包含i的值。
  • i不应该迭代到myarray.length,因为在最后几行中,不可能有一个有4个值的对角线。循环应该提前停止。

这是你的代码更正:

function fouradjacentFinder(){
let mystring = "08 02 22 97 38 15 ..."
// No need to have an anonymous function wrapper around Number
let myarray  = mystring.split(" ").map(Number); 
let max = -Infinity;
for (let i = 0; i + 3*21 < myarray.length; i++) { // Limit i
// Better not update myarray[i] and use separate variable
let product = 1; 
for (let k = i; k < i+4*21; k += 21) { // fix k
product *= myarray[k];
}
if (product > max){
max = product;
}
}
return max; // outside loop
}

最新更新