【问题标题】:Can somebody help me understand "for" functions?有人可以帮我理解“for”功能吗?
【发布时间】:2019-02-01 16:24:05
【问题描述】:

对于作业问题,我有以下代码:

有人能解释一下代码中发生了什么,为什么会导致 22 吗?

k <- 1    
for (i in 1:3){    
  k <- k + 1  
  for (j in 1:2){
    k = k * j
  }
}

【问题讨论】:

  • 只要跟着循环,为每一步写下k的值...
  • 作为一般规则,您可以使用 print 命令了解循环中发生的情况。 ,因此 print(k) 策略性地放置将向您展示正在发生的事情。

标签: r


【解决方案1】:

了解循环在任何编程语言中如何工作的一种简单方法是逐步了解循环的作用。

这里有一个简单的例子,说明如何在纸上“调试”。这在未来可能会有用。

下表代表循环的每次迭代和每个操作的值。

你应该这样读:

  1. 最初 k = 1;
  2. 在外循环的第一次迭代中,k 变为 k (1) + 1 的当前值,因此 k = 2。
  3. 然后内部循环进行第一次迭代,然后 j = 1 和 k = k (2) * j (1),所以 k = 2
  4. 然后内循环第二次迭代,j变成2,k还是2,所以k = k (2) * j (2) 所以k = 4
  5. 然后返回到外部循环,其中 i 变为 2 并且 k = k (4) + 1 => k = 5
  6. 然后重新开始内循环(重复步骤 3 和 4)

并重复直到 i 为 3。

【讨论】:

  • 非常感谢理查德!这真的让我明白了 for 循环是如何工作的。
【解决方案2】:

让我们逐行调试您的代码: 第一:

     k <- 1    // K = 1
        for (i in 1:3){ // all the content of this loop will be repeated 3 times because i is between 1 and 3 ( 1,2,3 ) = ( i=1, i=2 and i=3)
        //First time with: i=1
        k <- k+1 // K = 1 + 1 = 2
        for (j in 1:2){ // all the content of this loop will be repeated 2 times ( with : j=1 and j=2)
            //First time with j=1:
        k <- k*j // k = 2*1 = 2
            //Second time with j=2:
        k <- k*j // k=2*2 = 4
}
}
        //Second time with: i=2
        k <- k+1 // K = 4 + 1 = 5
        for (j in 1:2){ // all the content of this loop will be repeated 2 times ( with : j=1 and j=2)
            //First time with j=1:
        k <- k*j // k = 5*1
            //Second time with j=2:
        k <- k*j // k=5*2 = 10
}
}
        //Third time with: i=3 - the last one because i is between 1 and 3 ( 1,2,3 ) 
            k <- k+1 // K = 10 + 1 = 11
            for (j in 1:2){ // all the content of this loop will be repeated 2 times ( with : j=1 and j=2)
           //First time with j=1:
            k <- k*j // k = 11*1
           //Second time with j=2:
            k <- k*j // k=11*2 = 22
    }
    }

使用“for”背后的想法是,您希望根据条件重复循环内的代码多次,让我们举一个简单的例子: 我想打印十个“你好”:

for ( i in 1:10 ){
 print "hello";
}

如果我修改代码,让我们稍微复杂一点:

for ( i in 1:10 ){
 print "hello";
 i <- 11;
}

此代码的输出将只有 1 个“Hello”,因为“i”= 11 和 11 不在 1 和 10 之间 - 因为 i 在 1:10 -

【讨论】:

    【解决方案3】:

    一开始你有一个名为 k 的变量,其值为 1。 k=1

    要获得 22 的结果,第一个 for 循环应该以 4 而不是 3 结束。可能我错了,因为我不确定编程语言之间是否存在差异。

    第一个 for 循环从 1 到 4 进行 k 次迭代,并将其添加到变量“k”中。

    第二个取新的 k 并先将其乘以 1,然后再乘以 2。

    希望下面的代码能帮助你理解。

    k=1
    1. For-loop (1:4) 
    k = 1 + 1   // k = 2 
    k = 2 + 2  // k = 4 
    k = 4 + 3   // k = 7 
    k = 7 + 4    // k = 11
    
    k=11
    2. For-loop (1:2) 
    k = k * 1   // k = 11 
    k = k * 2   // k = 22
    
     k = 22
    

    【讨论】:

    • 您似乎忽略了 for 循环是嵌套的。外部循环每次都将1 添加到k,而不是您的代码中的i。但更重要的是,内循环每次外循环都会发生。
    【解决方案4】:

    print 语句添加到您的循环中。这是一种很好的调试方式,也是查看正在发生的事情的绝佳方式。如果你运行这个,我想它会帮助你理解。

    k <- 1    
    for (i in 1:3){    
      print(sprintf("Outer loop: i = %s, k = %s", i, k))
      k <- k + 1
      print(sprintf("Added one, now k = %s", k))
      for (j in 1:2){
        print(sprintf("  Inner loop: j = %s, k = %s", j, k))
        k = k * j
        print(sprintf("  Multiplied, now k = %s", k))
      }
    }
    

    这将打印:

    [1] "Outer loop: i = 1, k = 1"
    [1] "Added one, now k = 2"
    [1] "  Inner loop: j = 1, k = 2"
    [1] "  Multiplied, now k = 2"
    [1] "  Inner loop: j = 2, k = 2"
    [1] "  Multiplied, now k = 4"
    [1] "Outer loop: i = 2, k = 4"
    [1] "Added one, now k = 5"
    [1] "  Inner loop: j = 1, k = 5"
    [1] "  Multiplied, now k = 5"
    [1] "  Inner loop: j = 2, k = 5"
    [1] "  Multiplied, now k = 10"
    [1] "Outer loop: i = 3, k = 10"
    [1] "Added one, now k = 11"
    [1] "  Inner loop: j = 1, k = 11"
    [1] "  Multiplied, now k = 11"
    [1] "  Inner loop: j = 2, k = 11"
    [1] "  Multiplied, now k = 22"
    

    这是非常彻底的 - 第一次很好。将来,您可以使用更简单的print 语句来节省时间。

    这也强调了 inner (j) 循环的作用是乘以 1,然后乘以 2。内部循环的最终效果就是将k 乘以 2,因此我们可以用一个循环执行所有相同(有意义的)操作:

    k <- 1    
    for (i in 1:3){    
      k <- k + 1
      k <- k * 2 ## equivalent to inner loop
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-14
      • 2021-05-30
      相关资源
      最近更新 更多