有人可以帮助我理解“ for”功能吗?

时间:2019-02-01 16:24:06

标签: r

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

有人可以解释一下代码中发生了什么,为什么会产生22?

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

4 个答案:

答案 0 :(得分:2)

这是简单的方法来理解循环任何编程语言是如何工作的跟进,一步一步它在做什么。

的下面一个简单的例子中如何纸可以在“调试”。将来可能会有用。

下表代表你的循环的每一次迭代和各操作的值。

您应该以这种方式阅读:

  1. 最初k = 1;
  2. 在外循环的第一次迭代中,k变为k(1)+ 1的当前值,因此k = 2。
  3. 然后,将内环使得其第一次迭代,则j = 1和k = K(2)*∫(1),所以K = 2
  4. 然后内环的第二次迭代中,J为2,k为2仍然,所以K = K(2)*∫(2),所以K = 4
  5. 后,返回到外循环,其中i变为2且k = K(4)+ 1 => K = 5
  6. 然后再次启动内部循环(重复步骤3和4)

和重复,直到i为3。

enter image description here

答案 1 :(得分: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中-

答案 2 :(得分:0)

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

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

第一个for循环将k从1迭代到4,并将其添加到变量“ 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

答案 3 :(得分:0)

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
}