学习 › TypeScript
流程控制 · 06
循环
把同一件事做很多次:for 和 while。
循环会把同一段代码执行很多次。
下面的例子从 1 到 n 逐个输出数字并累加,最后输出总和。
n = int(input())total = 0for i in range(1, n + 1): print(i) total += iprint(total)const n = Number(require("fs").readFileSync(0, "utf8"));let total = 0;for (let i = 1; i <= n; i++) { console.log(i); total += i;}console.log(total);import { readFileSync } from "node:fs";const n: number = Number(readFileSync(0, "utf8"));let total: number = 0;for (let i = 1; i <= n; i++) { console.log(i); total += i;}console.log(total);import java.util.Scanner; public class Main { public static void main(String[] args) { int n = new Scanner(System.in).nextInt(); int total = 0; for (int i = 1; i <= n; i++) { System.out.println(i); total += i; } System.out.println(total); }}using System; class Program{ static void Main() { int n = int.Parse(Console.ReadLine()); int total = 0; for (int i = 1; i <= n; i++) { Console.WriteLine(i); total += i; } Console.WriteLine(total); }}#include <iostream> int main() { int n, total = 0; std::cin >> n; for (int i = 1; i <= n; i++) { std::cout << i << '\n'; total += i; } std::cout << total << '\n';}#include <stdio.h> int main(void) { int n, total = 0; scanf("%d", &n); for (int i = 1; i <= n; i++) { printf("%d\n", i); total += i; } printf("%d\n", total); return 0;}n = 控制台.读行().转数字();total = 0;循环 (i = 1; i <= n; i++){ 控制台.输出(i); total += i;}控制台.输出(total);5
1 2 3 4 5 15
要点
- 最常见的形式是“从 1 到 n”。
要定下起始值、继续的条件,以及每一轮的变化量。 - 在循环中把值收集起来的累加(
total += i)是求和、计数、求最大值题目的基础。 - 逐个遍历列表或字符串时,有不用下标、直接取出值的简短写法。
- while 只看条件,条件为真就一直循环。
break跳出循环,continue只跳过本轮。
两者都只作用于最内层的一个循环,所以要一次跳出双重循环,可以用标记变量,或者在函数中return。
各语言的写法
| Python | for i in range(1, n + 1): — range 不包含结束值。步长用 range(10, 0, -2),逐个取用 for x in nums:,按条件用 while 条件:。没有 do-while |
|---|---|
| JavaScript | for (let i = 1; i <= n; i++),步长用 i -= 2。逐个取用 for (const x of nums)。while (条件) { }、do { } while (条件);。要跳出外层循环用标签 break outer; |
| TypeScript | 和 JavaScript 一样 |
| Java | for (int i = 1; i <= n; i++),逐个取用 for (int x : nums)。while、do { } while。也可以用标签 break outer; |
| C# | for (int i = 1; i <= n; i++),逐个取用 foreach (var x in nums)。while、do { } while |
| C++ | for (int i = 1; i <= n; i++),逐个取用 for (int x : nums)。while、do { } while |
| C | for (int i = 1; i <= n; i++) — 没有逐个取值的写法,只能按下标循环。while、do { } while |
| Craykon | 循环 (i = 1; i <= n; i++),逐个取用 遍历 (x 在 nums),按条件用 当 (条件) { }。跳出用 跳出,跳过用 继续。没有 do-while。当 在场景(动画)中每轮停一帧,但在控制台解题中不停顿 |
常见错误
while 中没有改变条件
i = 1
while i <= 5:
print(i)→ 永远不会结束,一直输出 1
一定要在循环体里写改变条件的那一行(i += 1、i++)。
用 for … in 遍历值JavaScript · TypeScript
const nums = [10, 20];
for (const x in nums) console.log(x);→ 0、1 — 得到的是下标而不是值(而且是字符串 "0"、"1")
遍历值要用 for (const x of nums)。
循环结束后还用 iJava · C# · C · C++ · JavaScript · TypeScript · Craykon
for (int i = 0; i < 3; i++) { }
printf("%d\n", i);→ 报错 — 在 for 中创建的 i 只存在于循环内
循环后还要用,就在循环前创建。
Python 的 i 在循环后仍保留最后的值。
各语言的差异
Python 的
C 系和 Craykon 也要再确认一次是
差一位导致答案错误,是循环中最常见的失误。
Python 的
range(a, b) 不包含 b,所以 1 到 n 要写 range(1, n + 1)。C 系和 Craykon 也要再确认一次是
i <= n 还是 i < n。差一位导致答案错误,是循环中最常见的失误。