for
循环在算法当中的使用非常广泛,是学习算法的最重要基础语法之一。
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
}
迭代条件可以是任意的表达式,他通常是在初始值的基础之上,进行变化。例如,递减
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
}
在复杂场景下,嵌套循环是一个常用的技术手段。例如,在最长公共子序列、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
。外层循环每执行一次,内层循环就会执行一轮
。初学者要稍微花一点时间去感悟一下。
for 循环在算法中的运用非常广泛。例如,最简单的线性搜索
从数组中,找到目标值的索引
10
function
linearSearch
(
arr
,
target
) {
20
for
(
let
i
=
0
; i
<
arr.
length
; i
++
) {
30
if
(arr[i]
===
target) {
40
return
i;
// 找到目标,返回索引
50
}
60
}
70
return -
1
;
// 未找到
80
}
90
10
// 使用示例
11
const
numbers
=
[
4
,
2
,
7
,
1
,
9
];
12
console.
log
(
linearSearch
(numbers,
7
));
// 输出: 2
字符串反转,也是一个常见的算法题目
输入:hello
->输出:olleh
核心思路是定义一个索引指针从字符串的末尾往前移动,并记录每次移动的字符,最后把这些字符拼接起来
10
function
reverseString
(
str
) {
20
let
reversed
=
''
;
30
for
(
let
i
=
str.
length
-
1
; i
>=
0
; i
--
) {
40
reversed
+=
str[i];
50
}
60
return
reversed;
70
}
80
90
// 使用示例
10
console.
log
(
reverseString
(
'hello '
));
// 输出: 'olleh '