OSDN Git Service

:sparkles: add loop
authorouuan <y___o___u@126.com>
Tue, 3 Sep 2019 03:39:24 +0000 (11:39 +0800)
committerouuan <y___o___u@126.com>
Tue, 3 Sep 2019 03:39:24 +0000 (11:39 +0800)
docs/lang/images/loop1.png [new file with mode: 0644]
docs/lang/images/loop2.png [new file with mode: 0644]
docs/lang/images/loop3.png [new file with mode: 0644]
docs/lang/loop.md

diff --git a/docs/lang/images/loop1.png b/docs/lang/images/loop1.png
new file mode 100644 (file)
index 0000000..7814ff8
Binary files /dev/null and b/docs/lang/images/loop1.png differ
diff --git a/docs/lang/images/loop2.png b/docs/lang/images/loop2.png
new file mode 100644 (file)
index 0000000..e630b01
Binary files /dev/null and b/docs/lang/images/loop2.png differ
diff --git a/docs/lang/images/loop3.png b/docs/lang/images/loop3.png
new file mode 100644 (file)
index 0000000..8df111d
Binary files /dev/null and b/docs/lang/images/loop3.png differ
index 8b13789..8728bb5 100644 (file)
@@ -1 +1,216 @@
+有时,我们需要做一件事很多遍,为了不写过多重复的代码,我们需要循环。
+
+有时,循环的次数不是一个常量,那么我们无法将代码重复多遍,必须使用循环。
+
+## for 语句
+
+以下是 for 语句的结构:
+
+```cpp
+for (初始化; 判断条件; 更新) {
+    循环体;
+}
+```
+
+执行顺序:
+
+![](images/loop1.png)
+
+e.g. 读入 n 个数:
+
+```cpp
+for (int i = 1; i <= n; ++i) {
+    cin >> a[i];
+}
+```
+
+for 语句的三个部分中,任何一个部分都可以省略。其中,若省略了判断条件,相当于判断条件永远为真。
+
+## while 语句
+
+以下是 while 语句的结构:
+
+```cpp
+while (判断条件) {
+    循环体;
+}
+```
+
+执行顺序:
+
+![](images/loop2.png)
+
+e.g. 验证 3x+1 猜想:
+
+```cpp
+while (x > 1) {
+    if (x % 2 == 1) {
+        x = 3 * x + 1;
+    } else {
+        x = x / 2;
+    }
+}
+```
+
+## do...while 语句
+
+以下是 do...while 语句的结构:
+
+```cpp
+do
+{
+    循环体;
+} while (判断条件);
+```
+
+执行顺序:
+
+![](images/loop3.png)
+
+与 while 语句的区别在于,do...while 语句是先执行循环体再进行判断的。
+
+e.g. 枚举排列:
+
+```cpp
+do {
+    // do someting...
+} while (next_permutation(a + 1, a + n + 1));
+```
+
+## 三种语句的联系
+
+```cpp
+// for 语句
+
+for (statement1; statement2; statement3) {
+    statement4;
+}
+
+// while 语句
+
+statement1;
+while (statement2) {
+    statement4;
+    statement3;
+}
+```
+
+这两种方式是等价的。
+
+```cpp
+// while 语句
+
+statement1;
+while (statement2) {
+    statement1;
+}
+
+// do...while 语句
+
+do {
+    statement1;
+} while (statement2);
+```
+
+这两种方式也是等价的。
+
+```cpp
+while (1) {
+    // do something...
+}
+
+for (;;) {
+    // do something...
+}
+```
+
+这两种方式都是永远循环下去。
+
+可以看出,三种语句可以彼此代替,但一般来说,语句的选用遵守以下原则:
+
+1. 枚举一个变量时,使用 for 语句;
+2. “到何时为止”时,使用 while 语句;
+3. 使用 while 语句时,若要先执行循环体再进行判断,使用 do...while 语句。
+
+## break 与 continue 语句
+
+break 语句的作用是退出循环。
+
+continue 语句的作用是跳过循环体的余下部分,回到循环的开头。
+
+```cpp
+for (int i = 1; i <= 10; ++i) {
+    std::cout << i << std::endl;
+    if (i > 3) break;
+    if (i > 2) continue;
+    std::cout << i << std::endl;
+}
+
+/*
+输出如下:
+1
+1
+2
+2
+3
+4
+*/
+```
+
+break 与 continue 语句均可在三种循环语句的循环体中使用。
+
+一般来说,break 与 continue 语句用于让代码的逻辑更加清晰,例如:
+
+```cpp
+// 逻辑较为不清晰,大括号层次复杂
+
+for (int i = 1; i <= n; ++i) {
+    if (i != x) {
+        for (int j = 1; j <= n; ++j) {
+            if (j != x) {
+                // do something...
+            }
+        }
+    }
+}
+
+// 逻辑更加清晰,大括号层次简单明了
+
+for (int i = 1; i <= n; ++i) {
+    if (i == x) continue;
+    for (int j = 1; j <= n; ++j) {
+        if (j == x) continue;
+        // do something...
+    }
+}
+
+// for 语句判断条件复杂,没有体现“枚举”的本质
+
+for (int i = l; i <= r && i % 10 != 0; ++i) {
+    // do something...
+}
+
+// for 语句用于枚举,break 用于“到何时为止”
+
+for (int i = l; i <= r; ++i) {
+    if (i % 10 == 0) break;
+    // do something...
+}
+
+// 语句重复,顺序不自然
+
+statement1;
+while (statement3) {
+    statement2;
+    statement1;
+}
+
+// 没有重复语句,顺序自然
+
+while (1) {
+    statement1;
+    if (!statement3) break;
+    statement2;
+}
+```