资讯动态

循环练习题全攻略:从入门到进阶的核心技巧

发布时间:2026/10/15 7:10:31 来源:尧图企业网站定制
1. 为什么循环题是编程入门的第一道坎任何一个学过编程的人都绕不过循环这道关卡。不管是 Python 的for、while还是 C、Java、JavaScript 里的各种循环写法它都是程序里最基础也最容易被卡住的知识点。尤其对刚入门的新手来说前几节课可能还觉得赋值、变量、条件判断都挺轻松一到循环就开始迷茫for i in range(10)这行代码到底做了什么while什么时候停下来嵌套循环怎么就绕不清楚了我之前见过很多同学在循环这一章卡了很久问题恰恰出在练得少、练得偏。看教程的时候觉得每行代码都看得懂合上书自己动手写就大脑空白。这就是典型的“纸面会、实操废”。能做对循环题意味着你真正理解了程序如何自动重复执行任务这也是从“写单行代码”跨越到“写逻辑块”的关键一步。这篇内容就围绕“循环练习题”展开把常见题型、解题思路、易错点一次性讲透。不管你是完全零基础的新人还是学了一段时间回来补基础的又或者是准备面试前想快速过一遍循环题的求职者这篇文章都能派上用场。我会从题目分类、思路拆解、实战代码、Bug 排查几个维度把我实际刷题和带人过程中积累的经验全部写出来。2. 循环的核心弄懂重复、条件和跳出2.1 循环的“三层理解法”很多教材讲循环只讲语法不讲心智模型导致很多人死记硬背。我总结了一个“三层理解法”每次讲循环必提第一层循环是一台复印机。你给复印机一叠原稿它就会一张一张地复印直到纸用完了。循环也是for循环会按顺序把一个序列中的“纸”取出来每取一张执行一次循环体。这里的“纸”可以是列表里的每个元素、range()生成的每个数字、字符串里的每个字符。第二层循环是一个哨兵站岗。while循环更像一个哨兵他会反复检查一个条件“敌人来了吗来了就继续巡逻没来就休息”。只要条件为真就继续执行条件为假就退出。所以用while写循环,本质上是在表达“反复执行某件事直到某个条件不满足为止”。第三层循环是一个计数器。程序处理批量数据时经常需要知道“处理到第几个了、还剩多少”。三要素是初始值、循环继续执行的条件、每次迭代后的更新。比如i 1 # 初始值 while i 5: # 条件 print(i) i 1 # 更新这三层理解合在一起基本能解释所有循环场景。做题的时候先问自己是遍历一批数据还是反复执行直到某件事发生或者是计数确认了类型选循环结构就顺了。2.2 for 和 while 应该怎么选初学者经常纠结同一道题到底用for还是while我直接给一个判断准则知道要处理多少轮、要遍历哪些元素时优先用for。比如打印 1 到 100、遍历列表、逐行读文件。不知道要循环多少轮只知道什么时候停下来时用while。比如让用户输入密码直到正确、不断取随机数直到满足条件。看两个例子# 合适用 for明确遍历 5 次 for i in range(5): print(f第{i1}次打印) # 合适用 while只知道“不等就继续”的循环次数不确定 import random num 0 while num ! 6: num random.randint(1, 6) print(摇骰子, num)很多人会把“不确定次数”的题目硬套for结果还得额外加计数器代码绕一圈又变回while。这个东西用一次就有了体感做题时会形成肌肉记忆。3. 循环练习题的类型拆解从题型到考点3.1 经典题型的分布地图我整理了一下循环练习题最常见的几大类后面每一类我都会用自己的话拆一遍考点题型分类典型题目核心考点数列输出打印 1 到 100、打印偶数、逆序输出循环步长、边界条件求和与累乘求 1 到 n 的和、阶乘累加器思想、变量覆盖嵌套循环九九乘法表、各种星号图形内外层关系、格式化输出数位处理水仙花数、回文数、各位数字之和取余和整除、循环拆分数字数学问题素数判断、最大公约数、斐波那契穷举思想、遍历范围优化经典算法入门冒泡排序、二分查找双重循环、状态标记这六类基本构成了循环练习题的“骨架”。你会发现不少题在不同语言里都被反复使用不是因为这些题古老而是它们确实能在很短的代码里考察多维度的能力。3.2 每个阶段的练习重心刚接触循环的第一周别急着挑战那种综合题。我一般建议按这样的路径来先练单层循环的基本功输出数列、累加、累计、统计个数。这个阶段目标是熟练写出三要素不犯错。再练条件与循环的组合循环里嵌套if比如筛出偶数、统计某个字符出现次数。第三阶段攻嵌套循环重点是理清“外层循环控制行内层循环控制列”这个核心口诀。最后练算法型循环题把循环当工具去解决素数和排序这种更综合的任务。我自己带过一个零基础的朋友他一开始做题总是先动手写代码再想逻辑。后来我逼着他每题先写伪代码只用三行说思路再去写实代码。坚持二十题以后正确率明显上来了。循环题真正考的是“先想清楚再写”的习惯而不是打字速度。4. 手把手拆解五道必练循环题4.1 累加求和for 循环的入门试金石求 1 加到 100 是循环题里的“hello world”它最直接地考察累加器思想。新手经常犯的错是每次循环都把结果重置了导致最后算出来就是最后一个数。正确写法total 0 # 累加器从 0 开始 for i in range(1, 101): # range 左闭右开所以是 1 到 100 total i # 每轮把当前数累加上去 print(total) # 5050为什么累加器必须放在循环外面因为它的生命周期是“整个循环过程”而不是“某一次迭代”。每次进入循环体total 都要保留上一次累积的结果。如果把total 0写进循环体里那就相当于每轮开始前把钱清空最后只剩最后一笔收入。这里还可以延伸一个变体计算 1 到 100 中所有偶数的和。思路是在循环里加一个if i % 2 0的判断或者直接用range(2, 101, 2)步长为 2 一次到位。两种写法都可以但后者更高效也体现出你对步长的理解。4.2 打印星号图形嵌套循环的经典战场打印三角形的题目看起来简单其实它同时考三样东西外层循环、内层循环、以及内层循环的规律计算。输出一个五行的直角三角形第一行 1 个星号第二行 2 个星号以此类推n 5 for i in range(1, n 1): # i 代表当前行号从 1 开始 for j in range(i): # 第 i 行打印 i 个星号 print(*, end) print() # 换行执行过程是这样的外层第一次循环i1内层 range(1) 只循环一次打印一个星号外层第二次循环i2内层 range(2) 循环两次打印两个星号……每次外层迭代结束print()负责换行。我把嵌套循环的核心总结成一个口诀外层循环数是图形的行数内层循环数是一行里的元素个数元素的个数通常和所在行号存在函数关系。比如菱形、空心的三角形、倒三角无非是在“每行打印几个空格、几个星号”上做文章本质都是同样的结构。你先画一个 3 行的三角把每行的列数变化写在纸上比凭空想代码快得多。4.3 水仙花数数字拆解与穷举遍历所谓水仙花数是指一个三位数其各位数字的立方和等于该数本身比如 153 1³ 5³ 3³。题目要求找出所有三位水仙花数。这题有两个考点一是遍历范围100 到 999二是从三位数中拆出百位、十位、个位。常见做法有两种用整除和取余拆位或者把数字转成字符串用索引取字符。初学者做这题最好练第一种数学思维浓度更高。for n in range(100, 1000): hundreds n // 100 # 整除得到百位 tens (n // 10) % 10 # 先得到前两位组成的数再取个位得到十位 ones n % 10 # 直接取余得到个位 if hundreds**3 tens**3 ones**3 n: print(n)这里有个新手常踩的坑十位的拆法。有人会写成(n % 100) // 10结果也一样对但思路反过来先去掉百位再整除得到十位。两种写法都行关键是理解整除和取余在位数拆分里的含义。//是去掉右边的数字%是保留右边的数字。这个理解铺开了遇到任意位数的数字处理都不会慌。这种穷举遍历的思路以后做不少算法题都会用到。就是在一定范围内把每个候选值都试一遍用条件筛出符合条件的。循环就是穷举的载具条件判断就是筛子。4.4 斐波那契数列循环代替递归的好例子斐波那契数列从第 3 项开始每一项等于前两项之和1, 1, 2, 3, 5, 8……很多教材会用递归讲这题但新手用递归经常一头雾水也容易写出指数级复杂度的代码。用循环写就非常直观还能顺便理解“状态变量更新”这个核心思想。a, b 1, 1 n 10 print(a) print(b) for i in range(3, n 1): a, b b, a b print(b)执行过程里我最想强调这段a, b b, a b这一行同时执行右边、再统一赋值。第一次迭代时a 变成原来的 b1b 变成 a 加 b2。这样迭代后每轮的 a 和 b 恰好是相邻两个斐波那契数。如果拆成两行写a b b a b那 b 就变成了原来的 b 原来的 b完全错误。因为第一行已经改了 a 的值第二行的 a 不再是原来的 a。Python 的并行赋值直接规避了这个坑而 C、Java 里就需要借助临时变量。这种细节就是做循环题时最容易不知不觉出错的地方。4.5 冒泡排序循环嵌套与交换的完整演练排序题对初学者来说有一定难度但冒泡排序是其中逻辑最简单、最适合练手的一道。先理解排序过程从前到后两两比较相邻元素如果前一个比后一个大就交换位置。一轮下来最大的数就像气泡一样浮到了最后。再对前 n-1 个元素做同样的操作直到全部有序。nums [64, 34, 25, 12, 22, 11, 90] n len(nums) for i in range(n - 1): # 外层循环需要进行 n-1 轮 for j in range(n - 1 - i): # 内层循环每轮比较次数递减 if nums[j] nums[j 1]: nums[j], nums[j 1] nums[j 1], nums[j] print(nums)外层循环次数为什么是 n-1因为 n 个数最多只需要 n-1 轮冒泡最后一轮其实已经不需要了。内层的n - 1 - i表示每轮结束后末尾已经有序的部分就不再参与比较这是对执行次数的优化。写这题时最容易出错的是内层的边界j从 0 到n-2-i如果写成range(n - 1)不减去 i程序也能运行但会多比较已经排好的元素执行效率变差。循环题里边界条件写错不报错但结果或性能不对这也是它比语法题更考验人的地方。5. 循环练习的常见 Bug 与调试思路5.1 死循环程序没有结束的原因死循环大概是循环题里让人最崩溃的错误。程序运行后一直没有输出停不下来甚至电脑风扇开始狂转。常见原因有几个while条件永远为真循环体里也没有 break 或条件变更。忘记更新循环变量比如while i 10:里没有i 1。更新语句放到了条件判断不可能执行到的分支里。i 1 while i 5: print(i) # 忘了写 i 1i 永远是 1这个例子就是典型的“循环变量不更新”。排查死循环时有一个很管用的办法在循环体里加临时打印输出循环变量的当前值看它是否在变化。i 1 while i 5: print(debug: i , i) i 1看到调试图里 i 换了但条件始终满足说明条件边界或更新逻辑有问题。靠眼睛看不出来的逻辑错误打印往往一招命中。5.2 边界条件差一错误与区间含不含循环里最常见的逻辑错误是“差一”。英文里有个专门的叫法叫 off-by-one error意思是循环多跑一次或少跑一次。问题根源就是range()的区间规则是左闭右开[start, stop)。想打印 1 到 5# 错误range(1, 5) 输出 1 2 3 4少了 5 for i in range(1, 5): print(i) # 正确range(1, 6) 输出 1 2 3 4 5 for i in range(1, 6): print(i)我建议做循环题的时候把“范围含不含边界”先在注释里写清楚然后再写代码。比如“打印 1 到 100”就写# [1, 100]然后range(1, 101)一目了然。这个习惯用熟了能避免大量边界错误。还有一类边界问题出现在循环体内访问列表元素时。比如遍历[1, 2, 3]用for i in range(len(nums))在循环里写nums[i 1]i 走到最后一位就会越界。原则上要访问下一个元素时遍历范围就要留出余量。5.3 常见错误速查表错误类型错误表现原因解决方案无限循环程序不结束循环变量不更新、条件恒为真检查三要素是否完整差一错误输出多一个/少一个边界范围理解错误先写边界注释再写 range累加器清零结果始终是最后一项累加变量在循环体内初始化初始化放循环外嵌套变量错用行列数量错乱内层错用外层变量画出行列对应表列表越界报错 index out of range访问了超出长度的下标检查索引范围必要时打印长度5.4 用“纸笔推演”代替盲目运行调试循环题新手比较常见的毛病是改一个参数运行一次反复试错。效率极低。我更推荐“纸笔推演”把循环变量、累加变量、输出结果列成一个表手工走两三次循环。比如上面的冒泡排序第一轮 i0j从0到5你需要手工比较六次吗不需要全部做完你只需要走到第一次交换发生、确认逻辑没错就停。这种方法花的时间少但对循环行为的理解深得多。程序运行是瞬时的但逻辑是一步一步发生的纸笔会强迫你把每一步想清楚。建议所有初学循环的人备一个草稿本不要整天只在 IDE 里改代码。你在纸上能正确地推演一个循环代码写好之后就不会有太大偏差。6. 从练习题到真实开发循环思维的迁移6.1 项目里循环比你想的更常见很多人练循环觉得很“玩具”觉得九九乘法表、水仙花数在真实项目里根本用不到。真有这个想法的同学不妨回忆一下网页后端要遍历数据库里的记录列表生成 JSON 返回是不是循环前端要渲染表格每一行的操作按钮是不是循环数据处理要逐行清洗 CSV 里的脏数据是不是循环批处理文件要把一个目录下的所有图片重命名是不是循环循环不是练习题专属它是最常用的编程范式。练习题只是让你在不开任何业务的情况下学会这种范式。理解了这一点做题时心态会不一样你会开始思考“这个遍历方式在真实场景里有什么代价”这比单纯会写更有价值。6.2 两层循环的应用场景嵌套循环在练习题里是画星号、输出九九乘法表但在真实开发里对应的是矩阵操作、表格行列处理、多层结构的遍历。比如按城市、按月份统计销售额就是外层遍历城市内层遍历 12 个月份依次汇总。再比如处理图片的像素时外层循环遍历每个像素行内层遍历每个列的像素计算灰度、调整亮度。逻辑上和打印星号一模一样只是把print(*)换成了实际的计算操作。我在讲嵌套循环时经常让学员做一件事把九九乘法表的输出逻辑改成“跳过偶数行”然后再改成“只输出能被 3 整除的乘积”。这些改造看似无聊实际是在训练你对循环执行顺序的掌控力。6.3 循环性能的简单判断循环题里优化可能不是第一优先级但你至少得知道如何评估循环的开销。单层循环访问 n 个元素时间复杂度是 O(n)。双层循环全都遍历 n 次就是 O(n²)。如果内层每次还做复杂计算数据量大了之后程序会明显变慢。用生活化类比单层循环相当于数钱包里有多少张钞票数 100 张就是 100 次双层循环相当于在班级里让每个同学和班里每个人握手一次40 个人的教室要握 780 次。数据规模一增大嵌套循环的消耗会急剧上升。练习题阶段你不需要追求极致的性能优化但至少要有意识地避免“不必要的内层循环”。比如判断素数完全不需要遍历到 n-1遍历到 n 的平方根就够了因为因数必然成对出现。这个优化思路用到循环里就是在穷举范围上动脑筋这也是从“会写循环”走向“会写高效循环”的分水岭。6.4 把题目改造成小工具练完一些基础题后我特别推荐做“题目改造”这个动作。把练习题往实际场景拉近不仅能巩固语法还能积累项目片段。举几个改造方向打印 1 到 100 偶数 → 统计一个班级成绩单里及格人数和平均分。水仙花数 → 写一个“数字黑洞”小游戏不断把一个数拆位排序再组合。冒泡排序 → 给一组客户端提交的时间戳排序输出先来后到的顺序。九九乘法表 → 生成一个斗地主的记分表模板外层循环玩家内层循环局数。改造的本质是题型不变场景替换。但正因为场景变了你不得不多想一步数据的输入输出怎么设计。这个多想一步就是从“写题”到“写程序”的过渡。7. 循环练习的避坑心得与进阶建议7.1 刷题数量重要但复盘更重要很多人问我循环题要刷多少道才够。我的看法是基础题型每种 10 道左右就够重要的是刷完之后的复盘。复盘不是看一遍标准答案就完事。我一般会做三件事对比自己的解法跟参考解法的差别。别人用的是步长跳过你用 if 筛选两种都能过但哪种更贴近题目意图总结这题用到的“核心动作”。是累加是计数是拆位是交换把动作记到一个本子上二十题之后你会发现自己已经能识别“题型套路”。找一个无关的改造方向再写一遍。比如把数字题改成字符题把累加改成字符串拼接。这个动作逼你脱离背模板回到逻辑本身。这三个动作做完一道题的收获能顶五道题。我后来看到不少学员不是不会写而是不会“回头看”代码敲完能跑就万事大吉。实际上循环题练的是思维不是手速。7.2 别只写一种语言如果你是抱着“学 Python 就够了”的心态做循环题我会建议稍微再了解另一门语言的循环写法。不用精通能看懂就行。原因是不同语言的循环语法不一样但循环逻辑完全一样。C 语言里的for (i 0; i n; i)和 Python 的for i in range(n)、JavaScript 的for (let i 0; i n; i)都在做同样的事。当你能用一种语言理解循环逻辑再用另一种语言“翻译”时你会发现自己的抽象能力拔高了一个层次。我在实际工作中需要维护多种技术栈的项目前端 JS 处理列表、后端 Python 处理数据、SQL 里写存储过程也有循环逻辑。如果当初只写过一种语言的循环这些场景切换肯定会让我手忙脚乱。循环逻辑是通用的语法只是壳。7.3 遇到底层变量修改时的心态调整循环中修改变量的规则和其他地方不太一样尤其是嵌套循环里修改外层循环变量很容易把自己绕晕。我刚学的时候也在这里栽过跟头当时写的代码是用外层 i 控制行、内层 j 控制列结果内层循环里反手改了 i整个图形全乱了。后来我想明白一个道理循环里的变量是“有责任的”。外层变量负责行数它就不应该被内层随意动。如果要依赖某一层的值就复制一份存到别的变量里去改。这不是语法限制而是代码责任心的问题。现在我看一些新手代码发现很多 Bug 都是变量身份混淆导致的跟当年自己的问题如出一辙。写着写着你会逐渐建立一种“变量归属感”哪个变量属于哪一层循环、承担什么职责。这种意识建立起来以后再写更复杂的逻辑就会顺手很多。7.4 一套完整的练习计划参考最后给一套我实际用过、也推荐过很多人的循环练习计划。每天大约投入 40 分钟到 1 小时连续一周基本能完成从零到熟的效果天数练习内容目标Day 1打印数列、步长控制、累加求和熟练写出单层循环三要素Day 2while 循环、猜数字、do-while 变形理解循环执行条件和退出时机Day 3嵌套循环打印图形、九九乘法表掌握内外层循环的关系Day 4数字拆位、水仙花数、回文数、最大公约数灵活组合循环和条件判断Day 5素数、斐波那契、阶乘、组合数典型数学算法的循环实现Day 6冒泡排序、选择排序、二分查找用循环实现基础算法Day 7综合题目 题目改造把循环迁移到实际场景每天练完把当天踩过的坑记下来不用写长篇大论一句话就行。比如“range 左闭右开又忘了”、“内层应该用 j 不用 i”。七天后回看这些记录就是最真实的进步轨迹。写在最后循环练习题看似基础但它真的是一块试金石。能把简单的循环写得干净、准确、不出边界问题你的编程地基就算打稳了一半。很多初学者追求刷难题、学框架我反而觉得不如静下心把循环这种基础模块练扎实。我后来在写各种自动化脚本、数据处理逻辑时多次感受到当年反复练习循环题带来的直觉帮助。最后再分享一个我自己的小习惯每次写循环前先在注释里写出循环的“起点、终点、步长、循环体要做什么”四行话。别嫌这个过程慢它真的能过滤掉绝大多数低级 Bug。等你写得多了、熟练了这个过程会自动化不再需要写在注释里但它当初帮你建立的思维方式会一直留下来。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑