for 循环在算法当中的使用非常广泛,是学习算法的最重要基础语法之一。

1、基础语法

for 循环是一个 在特定条件之下,重复执行内部逻辑(循环体) 的一个语法逻辑,可以用如下的语法结构来表示:

                                        
1
for (初始化; 停止条件; 迭代条件) {
2
// 循环体
3
}
  • 初始化的值是当前值,循环体执行时,会对当前值进行操作
  • 停止条件是一个判断条件,判断当前值是否满足条件,满足则停止循环
  • 迭代条件是每次循环结束 后,对当前值进行的操作

迭代条件是循环体执行结束之后,才会执行的操作。这是大家在学习 for 循环时,最容易忽略的一个知识点,从而导致许多人在工作多年之后,依然无法得心应手的去处理一些边界条件

例如,一个案例

  • 初始化时设定一个变量 i = 0
  • 停止条件是 i <10
  • 迭代条件是 i++ (每次循环结束后,变量 i 的值加一)
  • 循环体是 console.log(i)
                                        
1
for ( let i = 0 ; i < 10 ; i ++ ) {
2
console. log (i) // 0 1 2 3 4 5 6 7 8 9
3
}

需要特别注意,由于循环体执行结束之后,会执行迭代条件,因此,在最后一次循环体执行之后,变量 i 的值继续递增 9 ->10 。然后在停止条件判断时,i <10 不满足,因此循环结束。面试时,经常会问,循环体执行了几次?最终 i 的值是多少?这也是许多人容易忽视的知识点

我们也可以把初始条件写在循环的外面,例如:

                                        
1
let i = 0
2
3
for (; i < 10 ; i ++ ) {
4
console. log (i) // 0 1 2 3 4 5 6 7 8 9
5
}

划重点 ,如果判断条件变得更加复杂,我们也可以定义多个初始变量和迭代条件,例如:

                                        
1
for ( let i = 0 , j = 0 ; i < 10 && j < 10 ; i ++ , j ++ ) {
2
console. log (i, j) // 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
3
}

2、变体

迭代条件可以是任意的表达式,他通常是在初始值的基础之上,进行变化。例如,递减

                                        
1
for ( let i = 10 ; i > 0 ; i -- ) {
2
console. log (i); // 从10倒数到1
3
}

当然,也可以每次迭代都多加一点

                                        
1
for ( let i = 0 ; i < 10 ; i += 2 ) {
2
console. log (i); // 输出 0, 2, 4, 6, 8
3
}

一个比较常见的用法是遍历数组

                                        
1
const fruits = [ 'apple ' , 'banana ' , 'orange ' ];
2
3
for ( let i = 0 ; i < fruits. length ; i ++ ) {
4
console. log (fruits[i]);
5
}

有的时候,我们可能会有多个终止条件 ,我们可以把范围最大的终止条件放到外面,然后把一些小的终止条件,放到循环体内部来执行,通过 break 来终止循环

                                        
1
for ( let i = 0 ; i < 10 ; i ++ ) {
2
if (i === 5 ) break ;
3
console. log (i); // 输出 0-4
4
}

或者通过 continue 来跳过当前循环:当前的循环体逻辑不执行,直接进入下一次循环

                                        
1
for ( let i = 0 ; i < 10 ; i ++ ) {
2
if (i % 2 === 0 ) continue ;
3
console. log (i); // 输出奇数 1,3,5,7,9
4
}

3、嵌套循环

在复杂场景下,嵌套循环是一个常用的技术手段。例如,在最长公共子序列、React 底层的事件循环中,都使用到了嵌套循环。

for 循环的嵌套循环往往是一个二维的数据结构。我们可以用图示来表达

                                        
1
for ( let i = 0 ; i < 5 ; i ++ ) {
2
for ( let j = 0 ; j < 5 ; j ++ ) {
3
console. log ( `${ i }-${ j }` );
4
}
5
}

外层循环是 i ,内层循环是 j 。外层循环每执行一次,内层循环就会执行一轮 。初学者要稍微花一点时间去感悟一下。

4、在算法中的运用

for 循环在算法中的运用非常广泛。例如,最简单的线性搜索

从数组中,找到目标值的索引

                                        
1
function linearSearch ( arr , target ) {
2
for ( let i = 0 ; i < arr. length ; i ++ ) {
3
if (arr[i] === target) {
4
return i; // 找到目标,返回索引
5
}
6
}
7
return - 1 ; // 未找到
8
}
9
10
// 使用示例
11
const numbers = [ 4 , 2 , 7 , 1 , 9 ];
12
console. log ( linearSearch (numbers, 7 )); // 输出: 2

字符串反转,也是一个常见的算法题目

输入:hello ->输出:olleh

核心思路是定义一个索引指针从字符串的末尾往前移动,并记录每次移动的字符,最后把这些字符拼接起来

                                        
1
function reverseString ( str ) {
2
let reversed = '' ;
3
for ( let i = str. length - 1 ; i >= 0 ; i -- ) {
4
reversed += str[i];
5
}
6
return reversed;
7
}
8
9
// 使用示例
10
console. log ( reverseString ( 'hello ' )); // 输出: 'olleh '
上一篇
3、条件判断
下一篇
5、while 循环
专栏首页
到顶
专栏目录