[快速入门前端 48] JavaScript:迴圈 (3) 双重迴圈

双重迴圈

双重迴圈,又被称为「巢状迴圈」意思是两个 for 迴圈嵌套在一起,成为一个 for 迴圈中又有另一个 for 迴圈的架构。

for (外层初始化变数; 外层迴圈条件;外层变化语句) { // 大迴圈     for (内层初始化变数;内层迴圈条件; 内层变化语句) { // 小迴圈         // 执行的程式     };};

双重迴圈的执行顺序有点像时钟上时针跑一格、分针跑一圈的概念,当我们有两层 for 迴圈时,大迴圈每跑一次,小迴圈会跑数次(跑完整个迴圈),执行过程如下:

for (let i = 0; i < 2; i++) {    console.log("大迴圈" + i);    for (let j = 0; j < 2; j++) {        console.log("小迴圈" + j);    };    console.log("小迴圈执行结束");};// 1. 进入双重迴圈外层第一行,初始化外层变数 i = 0,判断迴圈条件为 true// 2. 条件为 true,执行 console,输出 「大迴圈 0」// 3. 执行内层迴圈,初始化内层变数 j = 0,判断回圈条件为 true// 4. 执行 console,输出「小迴圈 0」,小迴圈区块内程式执行完毕,变数 + 1,j 变为 1// 5. 回到小迴圈第一行判断条件,j 为 1 条件为 true,继续执行 console,输出「小迴圈 1」,并将 j + 1// 6. j 为 2,不符合条件,跳出内层回圈回到外层迴圈,输出「小迴圈执行结束」// 7. 外层迴圈区块内执行结束,变数 + 1,i 为 1// 8. 回到外层迴圈继续执行条件判断条件判断// 输出顺序// 大迴圈0 -> 小迴圈0 -> 小迴圈1 -> 小迴圈执行结束// 大迴圈1 -> 小迴圈0 -> 小迴圈1 -> 小迴圈执行结束

双层迴圈实际应用

印星星 1:
http://img2.58codes.com/2024/20158509QJZfzwehoO.jpg
上图我们可以看到是由一行五个、共有五行 * 符号组成的图形,若我们要将此图形用程式表达需要五行 *****,且每一行后面都必须加一个换行符 <br/>。这时候我们会发现其实要印五行、十行、或者一百行,其实都是一个重複性的动作,那就可以使用迴圈来简化我们的流程。

for (let i = 0; i < 5; i++) { // 0、1、2、3、4 共五次    document.write("*****<br/>"); // 每次都显示一整行}

使用 for 迴圈后我们可以发现不管要写几行都很简单,只要调整迴圈结束条件就可以了,但若我们一行要显示不只五个 * 符号的话还是需要手动打出来。不过当利用双层迴圈的特性,让外层迴圈控制行数,而内层迴圈控制一行有几个星星就很简单了。

for (let i = 0; i < 5; i++) { // 控制有几行    for (let j = 0; j < 5; j++) { // 每一行有几个星星        document.write("*");    }    // 小迴圈结束代表那一行内容结束,要换到下一行时需要加换行符    document.write("<br>");};

印星星 2:
http://img2.58codes.com/2024/20158509tvQY8971Km.jpg
分析以上图形,可以看到第一行有 1 颗星星,第二行有 2 个星星,以此类推.... 由已知规律分析如下:

//         行数     星星数   变数 i 的值// *      第 1 行     1         0// **     第 2 行     2         1// ***    第 3 行     3         2// ****   第 4 行     4         3// *****  第 5 行     5         4

可以看出若外层迴圈的变数 i 从 0 开始,每跑一圈 + 1,那每一行的星星数就会是 i+1,所以外层迴圈不变,只要将控制每行星星数量的小迴圈终止条件改为 i+1 就可以输出正确的图形。

for (let i = 0; i < 5; i++) { // 外层迴圈逻辑不变,控制行数    for (let j = 0; j < i+1; j++) { // 每行的星星数为 i + 1    document.write("*");    }    document.write("<br>");};

判断质数:
在上篇文章中我们有提到如何判断质数,这边就来简单複习一下。

let input = 3; // 判断 input 是否为质数let output = true; // 是否为质数,预设为 truefor (let i = 2; i < input; i++) {    if (input % i == 0) {        // input % i == 0 成立代表它可以被某数整除,代表它不是质数        output = false; // 不是质数,改变变数的值        break; // 只要有一个数可以被整除就不是质数了,所以可以直接跳出迴圈不用检查其他的    }};// 跑完迴圈后可以检查变数 output 的值,若为 true 表示为质数if (output == true) {    console.log("是质数");}else {    console.log("不是质数");}

判断区间中所有的质数:
进阶版,输出 1 ~ 100 中所有的质数。
首先我们先来分析计算了流程,我们需要将 1 到 100 的所有数都跑一遍并检查是否为质数,所以我们需要先写一个回圈,并在迴圈中验证该变数是否为质数:

for (let i = 1; i < 100; i++) {    // 验证 i 是否为质数    // 结合上个範例的质数判断    let output = true; // 预设 i 是质数    for (let j = 2; j < i; j++) {        if (i % j == 0) {            // i % j == 0 成立代表它可以被某数整除,代表它不是质数            output = false; // 不是质数,改变变数的值            break; // 只要有一个数可以被整除就不是质数了,所以可以直接跳出迴圈不用检查其他的        }    };    if (output == true) {        console.log(i);    }}

Tips:
在撰写双重迴圈时一定要注意内层和外层各自有完整的迴圈三要素:变数初始化、结束条件、及每跑一圈变数的变化。


上一篇:[快速入门前端 47] JavaScript:迴圈 (2) for 和 while 比较
下一篇:[快速入门前端 49] JavaScript:迴圈 (4) break 和 continue
系列文章列表:[快速入门前端] 系列文章索引列表


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章