【问题标题】:Multiple conditions in while loop giving different resultwhile循环中的多个条件给出不同的结果
【发布时间】:2018-04-02 21:16:50
【问题描述】:

我在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。

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

【问题讨论】:

  • 这两个循环不相同。第一个循环仅在两个条件都为真时执行。
  • 使用调试器单步执行,看看行为有何不同。
  • 什么会让你认为它们是相同的?标签垃圾邮件是怎么回事?

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      让我们检查两个循环:让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 循环执行更多次。

      【讨论】:

        【解决方案4】:

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

        计数++;

        j = j-1

        将在两个条件下执行 j >= 0arr[j] > key 为真。

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

        【讨论】:

          猜你喜欢
          • 2017-05-19
          • 1970-01-01
          • 1970-01-01
          • 2019-01-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-08
          • 1970-01-01
          相关资源
          最近更新 更多