CC++ & Algorithm

循环嵌套:用代码画出你想要的任何图形

你有没有想过,为什么同样的几行代码,有人能画出菱形、字母塔、九九乘法表,而你却只会打印一个正方形?

区别不在天赋,而在于你是否真正理解了循环嵌套的本质。今天,我们就用"排队做操"和"套娃"这两个生活场景,把循环嵌套彻底讲透。

循环嵌套的本质:外层管行,内层管列

循环嵌套就是一个循环里面再套一个循环。执行时,外层循环每跑一次,内层循环就要完整地从头跑到尾。

想象你在操场上排队做操:

  • 外层循环 = 你在第几排
  • 内层循环 = 这一排有多少个同学

每换一排,这一排的同学都要从头到尾报数一遍。这就是嵌套循环的执行逻辑。

在代码里,这个结构长这样:

forin range(行数):
    forin range(每行个数):
        打印内容(不换行)
    换行

记住这个骨架,你已经会了80%。

从正方形到三角形:一个关键变化

先看最简单的情况——打印一个4×4的正方形:

rows = 4
for i in range(rows):        # 外层:4行
    for j in range(rows):    # 内层:每行4个星号
        print('*', end='')
    print()                  # 换行

这没什么好说的。真正有意思的是,当你把内层循环的 range(rows) 改成 range(i),图形就变了:

rows = 5
for i in range(1, rows + 1):
    for j in range(i):       # 第i行打印i个星号
        print('*', end='')
    print()

输出:

*
**
***
****
*****

这就是从正方形到三角形的全部秘密:内层循环的次数依赖外层变量。

你可能会问:为什么 range(i) 就能让每行星号递增?因为当外层 i=1 时,内层循环执行1次;当 i=2 时,内层执行2次……以此类推。外层每走一步,内层就跟着调整自己的"步数"。

rows - i 画倒三角

理解了"内层依赖外层"这个核心思想,画倒三角形就顺理成章了:

rows = 5
for i in range(rows):         # i从0到4
    for j in range(rows - i): # 第i行打印 rows-i 个星号
        print('*', end='')
    print()

输出:

*****
****
***
**
*

这里的关键是:当 i=0 时,rows - i = 5,打印5个星号;当 i=4 时,rows - i = 1,打印1个星号。用外层变量的变化来"反向"控制内层循环的规模,这就是倒三角的秘诀。

实战:打印字母塔

来看一道经典的题目——打印字母塔

输入 3,输出:

  A
 BAB
CBABC

这道题考察什么?三点:

  1. 空格的控制:每行前面有空格,让字母居中
  2. 字母的顺序:前半部分升序,后半部分降序
  3. 嵌套循环的配合:一个内层循环打空格,另一个打字母

解题思路:

  • i 行(从0开始)有 N - 1 - i 个前导空格
  • 字母从 A + i 开始递减打印到 A,再递增打印到 A + i

核心代码:

for i in range(N):
    # 打印前导空格
    for j in range(N - 1 - i):
        print(' ', end='')
    # 打印降序字母(从当前行最大字母到A)
    for j in range(i, -1, -1):
        print(chr(65 + j), end='')
    # 打印升序字母(从B到当前行最大字母)
    for j in range(1, i + 1):
        print(chr(65 + j), end='')
    print()

这个例子告诉我们:一个图形可以拆分成多个"层次"——空格层、字母层、符号层——每一层用一个独立的循环来控制。当你学会拆解,再复杂的图形也能画出来。

常见坑:为什么你的代码总是变形?

我见过太多初学者在循环嵌套上栽跟头,总结下来就四个坑:

  1. 忘记换行——内层循环结束后没有 print(),所有星号连成一条直线。记住:内层循环负责一行,外层循环负责换行
  2. 内层循环写成固定值——打印三角形时写成 range(5),结果变成正方形。内层循环的次数要依赖外层变量
  3. 变量搞混——外层变量管行,内层变量管列。用反了图形就会"竖着长"。
  4. 缩进错误——Python中缩进决定代码归属。内层循环必须比外层多缩进一层,否则逻辑全乱。

进阶:菱形与更多可能

掌握了基础,我们来点进阶的——打印菱形:

rows = 7
mid = rows // 2

# 上半部分(含中间行)
for i in range(mid + 1):
    for j in range(mid - i):
        print(' ', end='')
    for j in range(2 * i + 1):
        print('*', end='')
    print()

# 下半部分(不含中间行)
for i in range(mid - 1, -1, -1):
    for j in range(mid - i):
        print(' ', end='')
    for j in range(2 * i + 1):
        print('*', end='')
    print()

输出:

   *
  ***
 *****
*******
 *****
  ***
   *

菱形 = 上半部分三角形 + 下半部分倒三角形。当你把一个复杂图形拆解成多个简单图形的组合,问题就迎刃而解了。

最后想说的

循环嵌套的本质,就是用外层循环控制"重复的次数",用内层循环控制"每次重复的内容"。这个思想不仅能画图形,还能处理二维数组、遍历表格、生成九九乘法表——几乎所有"重复中的重复"的问题,都能用循环嵌套解决。

给你一个练习建议:不要只满足于打印星号。试试打印九九乘法表、数字三角形、字母菱形。每画出一个新图形,你对循环嵌套的理解就会深一层。

当你真正掌握了循环嵌套,你会发现——代码就是你手中的画笔,而循环就是那支可以无限重复的魔法笔。


关于作者

我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。

这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。

如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)

这篇文章对你有帮助吗?

成为第一个评价的人

评论0

还没有评论,来抢沙发~

评论加载中...

想系统学习这个知识点?查看完整知识点 →