了解嵌套循环
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;
}
}
这会对图像进行嵌套循环,从各个像素获取值并使用该数据。
我希望这个答案提供了一个充分的例子来理解嵌套循环的用法。
我们的计算任务 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;
}
}
这会对图像进行嵌套循环,从各个像素获取值并使用该数据。
我希望这个答案提供了一个充分的例子来理解嵌套循环的用法。