分解这个嵌套的forloop

时间:2015-12-03 02:59:15

标签: javascript arrays algorithm for-loop

我正在尝试理解嵌套的forloops,我发现这段代码应该很简单,我希望你确保我理解它。

var maximum = function(arr){
var out;
for(var i = 0; i < arr.length; i++){
     out = true;
    console.log(i)
    for(var j = 0; j < arr.length; j++){

        if(arr[i] < arr[j]){
            // console.log(i, j)
            out = false;
             // console.log(arr[i], arr[j], " out ", out)
        }
    }
    if(out) return arr[i];
}
// return null;
}
 console.log(maximum([1,2,5]))

首先,我不确定他们为什么要定义out = true,但我现在想要解决循环问题

所以对于第一次迭代

i设置为0,out设置为true,然后我们进入第二个for循环

i = 0

在第二个forloop内:for(var j = 0; j < arr.length; j++){

我们测试(arr[i] < arr[j]) 3次的数组长度

内循环中的第一次测试:arr [0] = 1&lt; arr [0] = 1 == false(所以我们什么也不做?不应该保持为真,我们返回if(out) return arr[i];?)

内循环中的第二次测试arr [0] = 1&lt; arr [1] = 2 == true ..将out设为假

内循环中的第3次测试arr [0] = 1&lt; arr [2] = 5 == true ..将out设为假

然后我们去制作i 1

然后我们测试 是arr [i] = 2&lt; arr [j]是1?我们没有假装错误

是arr [i] = 2&lt; arr [j]是2?我们没有假装错误

是arr [i] = 2&lt; arr [j]是5?我们将out设置为true

然后我们将i设置为2 arr [2] = 5 arr [2]是5&lt; arr [0]这是1,这是假的,所以出局仍然是真的

是arr [2],其为5&lt; arr [1]这是2这是假的所以出来仍然是真的

是arr [2],其为5&lt; arr [2]这是5,这是假的,所以仍然是真的

嵌套循环的纠正过程是什么?

3 个答案:

答案 0 :(得分:1)

是的,你已经掌握了它的要点。内循环(使用j作为计数器变量的循环)将在外循环(i循环)运行时每次运行三次。

更简单的理解方法是运行以下代码:

for (var i = 0; i < 3; i += 1){
    console.log("outer loop")
    for (var j = 0; j < 3; j += 1){
        console.log("inner loop")
    }
}

这使您可以只关注嵌套循环而不是跳闸线变量以及您发布的原始代码中的变量。

答案 1 :(得分:0)

回答你的第一个问题:first of all i'm not sure why they define out = true - 这只是一个初始化,它会在外循环的每次迭代中重置。如果该值是最大值,那么out将保持为true - 否则它将为false。

回答第二个问题:1st test in the inner loop :arr[0] = 1 < arr[0] = 1 ==false (so we do nothing? shouldn't out remain true and we return if(out) return arr[i];?)

是的,你的测试是正确的 - 测试是假的,所以out仍然是正确的,但它不会下降到if(out)语句,直到内部循环完成迭代。

总结循环:内部循环将外部循环的当前值与所有其他值(包括其自身)进行比较。外循环遍历每个值(总共3次)。

答案 2 :(得分:0)

简短回答:是的,你是对的。

答案很长:

在一个坚果壳中,这个函数试图在数组中找到最大值,因此它设置了两个for循环。 i是第一个数字的索引,j是它与i进行比较的第二个数字的索引。

out的目的只是为了确保它不必继续外部循环,如果它发现它具有j的最大值。当ij是相同的值时,它会进行冗余检查,因为它是相同的数组,因此数字相同。理想情况下,它不需要进行此检查,但无论如何。

我认为您可能注意到的最大优化是当out设置为false时,是否真的需要继续?我们知道它不再是最大值所以为什么要这么麻烦?你可以通过制作inner loop check the value of out and break out

来解决这个问题
for(var i = 0; i < arr.length; i++){
     out = true;
    console.log(i)
    for(var j = 0; j < arr.length && out; j++){

        if(arr[i] < arr[j]){
            // console.log(i, j)
            out = false;
             // console.log(arr[i], arr[j], " out ", out)
        }
    }
    if(out) return arr[i];
}

希望这有帮助。