while循环中的多个条件给出不同的结果

时间:2017-10-22 04:22:26

标签: java c++ algorithm sorting insertion-sort

我在while循环中有两个条件:

count = 0;
while (j >= 0 && arr[j] > key)
       {
           count++;
           j = j-1;
       }

当我打破以下两个条件时,计数会发生变化:

while (j >= 0)
{
    if(arr[j] > key)
    {
        count++;
    }
    j = j-1;
}

第一个程序的输出:456

第二个程序的输出:904。

我认为这两个代码块是相同的。为什么这两个程序的计数会有所不同?

4 个答案:

答案 0 :(得分:4)

这两个版本在逻辑上并不相同。在第一个版本中,j仅在两个条件都为真时才会递减。在第二个版本中,j仅在第一个条件为真时才递减。当第二个版本中的密钥比较失败时,j仍然会减少。

因为j用作计算循环条件的一部分,这直接影响循环执行的次数。

答案 1 :(得分:1)

在第一个循环j仅在arr[j] > key条件为true时减少。在第二个循环j减少每一步。假设arr[0] < key然后第一个循环将进行0次迭代,这个例子就是这些循环差异的最好例证。

答案 2 :(得分:0)

让我们检查两个循环:让j = 10,让key = 3arr[] = {1,2,3,4,5,6,7...}

在第一个循环中,我们有这种模式:

count = 0;
while ( j >= 0 && arr[j] > key ) {
    count++; 
    j = j-1;
}

输出每一步:

while ( /*j = */ 10 >= 0 && /*arr[10] = */ 11 > 3 ) { // TRUE
    count++; // count becomes 1
    j = j-1; // j becomes 9
}

while ( 9 >= 0 && 10 > 3 ) { // TRUE
    count++; // count becomes 2
    j = j-1; // j becomes 8
}

while ( 8 >= 0 && 9 > 3 ) {  // TRUE
    count++; // count becomes 3
    j = j-1; // j becomes 7
}

while ( 7 >= 0 && 8 > 3 ) { // TRUE
    count++; // count becomes 4
    j = j-1; // j becomes 6
}

while ( 6 >= 0 && 7  > 3 ) { // TRUE
    count++; // count becomes 5
    j = j-1; // j becomes 5
}

while ( 5 >= 0 && 6 > 3 ) { // TRUE
    count++; // count becomes 6
    j = j-1; // j becomes 4
}

while ( 4 >= 0 && 5 > 3 ) { // TRUE
    count++; // count becomes 7
    j = j-1; // j becomes 3
}

while ( 3 >= 0 && 4 > 3 ) { // TRUE
    count++; // count becomes 8
    j = j-1; // j becomes 2
}

while ( 2 >= 0 && 3 > 3 ) { // FALSE 
    // loop breaks: First Condition TRUE, Second Condition FALSE
}

简化输出:

// Initial count = 0, j = 10, constant key = 3, arr[] = {1,2,3,4,5,6,7...}

count = 0  j = 10  arr[10] = 11 compound condition = true
count = 1  j = 9   arr[9]  = 10 compound condition = true
count = 2  j = 8   arr[8]  = 9  compound condition = true
count = 3  j = 7   arr[7]  = 8  compound condition = true
count = 4  j = 6   arr[6]  = 7  compound condition = true
count = 5  j = 5   arr[5]  = 6  compound condition = true
count = 6  j = 4   arr[4]  = 5  compound condition = true
count = 7  j = 3   arr[3]  = 4  compound condition = true
count = 8  j = 2   arr[2]  = 3  compound condition = false

count = 8 // 8 times it looped successfully

在第二个循环中,我们有这种模式:

while (j >= 0) {
    if(arr[j] > key) {
        count++;
    }
    j = j-1;
}

使用上面第一个循环中相同的初始条件j = 10key = 3arr[] = {1,2,3,4,5,6,7...} ......

让我们输出每一步:

while ( /*j = */ 10 >= 0 ) { // TRUE
    if( /*arr[10] = */ 11  > 3 ) {  // TRUE
        count++; // count becomes 1
    }
    j = j-1; // j becomes 9
}

while ( 9 >= 0 ) { // TRUE
    if ( 10 > 3 ) { // TRUE
        count++; // count becomes 2
    }
    j = j-1; // j becomes 8
}

while ( 8 >= 0 ) { // TRUE
    if ( 9 > 3 ) { // TRUE
        count++; // count becomes 3
    }
    j = j-1; // j becomes 7
}

while ( 7 >= 0 ) { // TRUE
    if ( 8 > 3 ) { // TRUE
        count++; // count becomes 4
    }
    j = j-1; // j becomes 6
}

while ( 6 >= 0 ) { // TRUE
    if ( 7 > 3 ) { // TRUE
        count++; // count becomes 5
    }
    j = j-1; // j becomes 5
}

while ( 5 >= 0 ) { // TRUE
    if ( 6 > 3 ) { // TRUE
        count++; // count becomes 6
    }
    j = j-1; // j becomes 4
}

while ( 4 >= 0 ) { // TRUE
    if ( 5 > 3 ) { // TRUE
        count++; // count becomes 7
    }
    j = j-1; // j becomes 3
}

while ( 3 >= 0 ) { // TRUE
    if ( 4 > 3 ) { // TRUE
        count++; // count becomes 8
    }
    j = j-1; // j becomes 2
}

while ( 2 >= 0 ) { // TRUE
    if ( 3 > 3 ) { // FALSE
        count++; // count DOES NOT INCREMENT
    }
    j = j-1; // j becomes 1
}

while ( 1 >= 0 ) { // TRUE
    if ( 2 > 3 ) { // FALSE
         count++; // count DOES NOT INCREMENT
    }
    j = j-1; // j becomes 0
}

while ( 0 >= 0 ) { // TRUE
    if ( 1 > 3 ) { // FALSE
        count++; // count DOES NOT INCREMENT
    }
    j = j-1; // j becomes -1
}

while( -1 >= 0 ) { // FALSE
    // Loop breaks since its only condition if false.
}

简化输出:

// Initial count = 0, j = 10, constant key = 3, arr[] = {1,2,3,4,5,6,7...}

count = 0  j = 10  arr[10] = 11 while condition = true  | if condition = true
count = 1  j = 9   arr[9]  = 10 while condition = true  | if condition = true
count = 2  j = 8   arr[8]  = 9  while condition = true  | if condition = true
count = 3  j = 7   arr[7]  = 8  while condition = true  | if condition = true
count = 4  j = 6   arr[6]  = 7  while condition = true  | if condition = true
count = 5  j = 5   arr[5]  = 6  while condition = true  | if condition = true
count = 6  j = 4   arr[4]  = 5  while condition = true  | if condition = true
count = 7  j = 3   arr[3]  = 4  while condition = true  | if condition = true
count = 8  j = 2   arr[2]  = 3  while condition = true  | if condition = false
count = 8  j = 1   arr[1]  = 2  while condition = true  | if condition = false
count = 8  j = 0   arr[0]  = 1  while condition = true  | if condition = false
count = 8  j = -1  NO EXECUTION  while condition = false | NO EXECUTION

count = 8; // 11 times it looped successfully.

这两个循环不相同,并且没有相同的行为。第二个while循环将比第一个while循环执行更多次。

答案 3 :(得分:0)

对于第一种情况,你的陈述

计数++;

j = j-1

将在两个条件下执行 j&gt; = 0 arr [j]&gt;关键是真的。

但对于第二种情况,语句 j = j-1 仅在 j&gt; = 0 为真且语句 count ++ 时执行将在两个条件下执行 j&gt; = 0 arr [j]&gt;关键是真的。 :)