了解嵌套循环

Understanding nested loops

我们的计算任务 class 通过图像的像素来操作图像,我简直不知道从哪里开始,这让我意识到我对嵌套循环缺乏理解。

我了解 for 循环的正常工作原理,但我很难理解一个循环的功能 'looping' 另一个循环。我在 Youtube 上看过这些教程,他们会在其中使用嵌套循环创建模式,但他们几乎没有解释其背后的过程。

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

例如,假设您有 table 个学生及其所有家庭作业的成绩。

        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 的二维数组中,首先由学生索引,然后由家庭作业索引。

这可以用 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 值减半。

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

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;
  }
}

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

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