for
循环在算法当中的使用非常广泛,是学习算法的最重要基础语法之一。
for 循环是一个 在特定条件之下,重复执行内部逻辑(循环体) 的一个语法逻辑,可以用如下的语法结构来表示:
1for (初始化; 停止条件; 迭代条件) {2// 循环体3}
迭代条件是循环体执行结束之后,才会执行的操作。这是大家在学习 for 循环时,最容易忽略的一个知识点,从而导致许多人在工作多年之后,依然无法得心应手的去处理一些边界条件
例如,一个案例
i = 0
i < 10
i++
(每次循环结束后,变量 i
的值加一)console.log(i)
1for (let i = 0; i < 10; i++) {2console.log(i) // 0 1 2 3 4 5 6 7 8 93}
需要特别注意,由于循环体执行结束之后,会执行迭代条件,因此,在最后一次循环体执行之后,变量
i
的值继续递增9 -> 10
。然后在停止条件判断时,i < 10
不满足,因此循环结束。面试时,经常会问,循环体执行了几次?最终 i 的值是多少?这也是许多人容易忽视的知识点
我们也可以把初始条件写在循环的外面,例如:
1let i = 023for (; i < 10; i++) {4console.log(i) // 0 1 2 3 4 5 6 7 8 95}
划重点,如果判断条件变得更加复杂,我们也可以定义多个初始变量和迭代条件,例如:
1for (let i = 0, j = 0; i < 10 && j < 10; i++, j++) {2console.log(i, j) // 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 93}
迭代条件可以是任意的表达式,他通常是在初始值的基础之上,进行变化。例如,递减
1for (let i = 10; i > 0; i--) {2console.log(i); // 从10倒数到13}
当然,也可以每次迭代都多加一点
1for (let i = 0; i < 10; i += 2) {2console.log(i); // 输出 0, 2, 4, 6, 83}
一个比较常见的用法是遍历数组
1const fruits = ['apple', 'banana', 'orange'];23for (let i = 0; i < fruits.length; i++) {4console.log(fruits[i]);5}
有的时候,我们可能会有多个终止条件,我们可以把范围最大的终止条件放到外面,然后把一些小的终止条件,放到循环体内部来执行,通过 break
来终止循环
1for (let i = 0; i < 10; i++) {2if (i === 5) break;3console.log(i); // 输出 0-44}
或者通过 continue
来跳过当前循环:当前的循环体逻辑不执行,直接进入下一次循环
1for (let i = 0; i < 10; i++) {2if (i % 2 === 0) continue;3console.log(i); // 输出奇数 1,3,5,7,94}
在复杂场景下,嵌套循环是一个常用的技术手段。例如,在最长公共子序列、React 底层的事件循环中,都使用到了嵌套循环。
for 循环的嵌套循环往往是一个二维的数据结构。我们可以用图示来表达
1for (let i = 0; i < 5; i++) {2for (let j = 0; j < 5; j++) {3console.log(`${i}-${j}`);4}5}
外层循环是 i
,内层循环是 j
。外层循环每执行一次,内层循环就会执行一轮。初学者要稍微花一点时间去感悟一下。
for 循环在算法中的运用非常广泛。例如,最简单的线性搜索
从数组中,找到目标值的索引
10function linearSearch(arr, target) {20for (let i = 0; i < arr.length; i++) {30if (arr[i] === target) {40return i; // 找到目标,返回索引50}60}70return -1; // 未找到80}9010// 使用示例11const numbers = [4, 2, 7, 1, 9];12console.log(linearSearch(numbers, 7)); // 输出: 2
字符串反转,也是一个常见的算法题目
输入:hello
-> 输出:olleh
核心思路是定义一个索引指针从字符串的末尾往前移动,并记录每次移动的字符,最后把这些字符拼接起来
10function reverseString(str) {20let reversed = '';30for (let i = str.length - 1; i >= 0; i--) {40reversed += str[i];50}60return reversed;70}8090// 使用示例10console.log(reverseString('hello')); // 输出: 'olleh'