了解嵌套循环

时间:2019-01-26 22:08:42

标签: nested-loops

在我们的计算机课上,我们得到了一个任务,可以通过像素处理图像,而我实际上不知道从哪里开始,这使我意识到我对嵌套循环缺乏了解。

我了解for循环的正常工作方式,但是我很难理解一个循环“循环”另一个循环的功能。我在YouTube上看过了这些教程,他们将使用嵌套循环创建模式,但是他们几乎不解释其背后的过程。

最简单的理解方法是什么?

1 个答案:

答案 0 :(得分:1)

例如,假设您有一张学生表及其所有作业的成绩。

        Homework Grades
Student HW1  HW2  HW3  HW4
A       90   80   78   64
B       70   65   58   54
C       96   88   98   84
D       96   85   72   68

假设您要计算此课程的家庭作业的平均成绩。

现在,每个学生的家庭作业都有不同的年级。我们知道作业总成绩数等于作业数*学生人数,因此任何家庭作业的平均成绩是所有年级的总和除以年级数。

我们可以通过学生或家庭作业进行汇总。在这种情况下,我们将按学生进行汇总。我们将假定数据存储在名为allgrades的2D数组中,该数组首先由Student索引,然后由Homework Assignment索引。

这可以通过for循环来完成。

for (int i = 0; i < allgrades.length; i += 1) {

}

现在,我们要检索每个学生的成绩。如果我们获得了一个学生studentgrades的分数数组,则可以执行以下操作来获取所有学生作业的分数总和:

let sumgrades = 0;
for (int j = 0; j < studentgrades.length; j += 1) {
    sumgrades += studentgrades[j];
}

现在,如果我们想将其扩展到所有学生,我们可以将其嵌套在另一个for循环中以汇总所有年级。

let sumgrades = 0;
for (int i = 0; i < allgrades.length; i += 1) {
    let studentgrades = allgrades[i];
    for (int j = 0; j < studentgrades.length; j += 1) {
        sumgrades += studentgrades[j];
    }
}

在此代码的末尾,要获得任何作业的平均成绩,需要做的就是将sumgrades-总数除以作业数*学生数。

此聚合是嵌套循环的示例。

举一个关于图像处理的例子,假设我们要拍摄图像并将每个像素的RGB值减半。

我们可以在一个循环中迭代图像的第一维(本质上是2D数组),而在嵌套循环中,可以迭代另一维。

for (int i = 0; i < canvasWidth; i += 1) {
  for (int j = 0; j < canvasHeight; j += 1) {
    Pixel oldpixel = pixel(i, j);
    Pixel newpixel = Pixel();
    int newred = oldpixel.r/2;
    int newgrn = oldpixel.g/2;
    int newblu = oldpixel.b/2;

    newpixel.r = newred;
    newpixel.g = newgrn;
    newpixel.b = newblu;

    outputImage.pixel(i, j) = newpixel;
  }
}

这会在图像上进行嵌套循环,从各个像素获取值并使用该数据。

我希望这个答案为理解嵌套循环用法提供了充分的例子。