Python多重循环实战:从鸡兔同笼到打印菱形,这7个经典题目帮你彻底搞懂嵌套循环 Python多重循环实战7个经典题目带你玩转嵌套逻辑记得刚开始学编程时最让我头疼的就是多重循环。看着那些层层嵌套的for和while脑袋里就像打了一团乱麻。直到有一天我用多重循环解决了鸡兔同笼问题那种啊哈时刻至今难忘。今天我们就通过7个精心挑选的实战题目帮你彻底掌握这个看似复杂实则美妙的编程概念。1. 完全数探秘理解循环嵌套的基础完全数Perfect number是指一个数恰好等于它的真因子之和。比如612328124714。寻找完全数的过程能完美展示双重循环的配合。def find_perfect_numbers(limit): for num in range(1, limit 1): sum_factors 0 for factor in range(1, num): if num % factor 0: sum_factors factor if sum_factors num: print(f{num} 是一个完全数)这段代码中外层循环遍历所有待检查的数字内层循环则计算每个数字的真因子和。注意几个关键点内层循环的范围是range(1, num)因为一个数本身不算真因子因子检查使用取模运算num % factor 0当因子和等于原数时输出结果提示完全数非常罕见10000以内只有4个6、28、496、8128可以用来验证你的程序是否正确。2. 阶乘等式打印循环与字符串的默契配合打印阶乘等式看似简单实则考验循环与字符串操作的结合能力。比如输入5输出1!11 2!22*1 3!63*2*1 4!244*3*2*1 5!1205*4*3*2*1实现这个功能需要三重思维计算阶乘结果构建乘法表达式字符串格式化输出def print_factorial_equations(n): for i in range(1, n1): factorial 1 equation for j in range(i, 0, -1): factorial * j equation f{j}* if j ! 1 else f{j} print(f{i}!{factorial}{equation})这里使用了倒序循环(range(i, 0, -1))来构建乘法表达式避免了末尾多余的星号。实际项目中这种字符串拼接技巧经常用于生成日志或报告。3. 数字组合生成条件约束下的循环控制给定数字x1-9生成所有数位不超过x且各位不重复的三位数。比如x3时有效数字有123、132、213、231、312、321。这个题目教会我们如何在循环中加入条件判断def generate_unique_three_digits(x): count 0 for i in range(1, x1): # 百位数 for j in range(0, x1): # 十位数 if j i: continue # 跳过重复数字 for k in range(0, x1): # 个位数 if k i or k j: continue print(f{i}{j}{k}, end ) count 1 if count % 10 0: # 每10个数字换行 print() print()关键技巧使用continue跳过不符合条件的迭代通过嵌套循环遍历所有可能的组合格式化输出控制每行显示的数字数量4. 鸡兔同笼数学建模与循环结合经典的鸡兔同笼问题已知头的总数h和脚的总数f求鸡和兔的数量。我们可以用双重循环暴力枚举所有可能性def solve_chicken_rabbit(heads, legs): solution_found False for chickens in range(0, heads1): rabbits heads - chickens if 2*chickens 4*rabbits legs: print(f鸡{chickens}只兔{rabbits}只) solution_found True break if not solution_found: print(无解)不过更高效的做法是用数学方法直接计算def solve_chicken_rabbit_math(heads, legs): rabbits (legs - 2 * heads) // 2 chickens heads - rabbits if rabbits 0 and chickens 0 and (2*chickens 4*rabbits) legs: print(f鸡{chickens}只兔{rabbits}只) else: print(无解)这个例子展示了如何将数学思维与编程结合减少不必要的循环计算。5. 最优切割方案循环中的极值问题给定一根长木料需要切成19米和23米的短料求剩余最少的切割方案。这实际上是一个优化问题可以通过双重循环遍历所有可能的切割组合def optimal_cut(total_length): min_remainder total_length best_a 0 best_b 0 max_a total_length // 19 for a in range(1, max_a 1): remaining total_length - 19 * a if remaining 23: # 至少切一段23米的 continue b remaining // 23 remainder remaining % 23 if remainder min_remainder: min_remainder remainder best_a, best_b a, b print(f19米{best_a}段23米{best_b}段剩余{min_remainder}米)优化点外层循环的上限通过整除计算得出减少不必要的迭代内层通过除法和取模快速计算结果实时更新最小剩余值和最佳切割方案6. 字母金字塔循环与字符编码的艺术打印字母金字塔是理解循环控制流的绝佳练习。例如输入E输出A ABA ABCBA ABCDCBA ABCDEDCBA实现这个模式需要处理三个问题空格的数量字母的递增部分字母的递减部分def print_letter_pyramid(letter): n ord(letter.upper()) - ord(A) 1 for i in range(1, n1): # 打印前导空格 print( * (n - i), end) # 打印递增字母 for j in range(i): print(chr(ord(A) j), end) # 打印递减字母 for k in range(i-1, 0, -1): print(chr(ord(A) k - 1), end) print()技巧解析ord()和chr()实现字母与ASCII码的转换前导空格的数量与行号相关递增和递减部分分别用两个循环处理end参数防止自动换行7. 逻辑推理破案多重循环解决现实问题最后来看一个有趣的逻辑推理题四人中只有两人说真话找出真正的罪犯。这类问题可以通过枚举所有可能性来解决def solve_crime(): for a in [True, False]: # A是否是罪犯 for b in [True, False]: # B是否是罪犯 for c in [True, False]: # C是否是罪犯 for d in [True, False]: # D是否是罪犯 # 确保只有一个罪犯 if [a, b, c, d].count(True) ! 1: continue # 四个人的陈述 stmt_a b or c or d stmt_b not b and c stmt_c a or d stmt_d stmt_b # 统计真话数量 truth_count sum([stmt_a, stmt_b, stmt_c, stmt_d]) if truth_count 2: if a: print(A是罪犯) if b: print(B是罪犯) if c: print(C是罪犯) if d: print(D是罪犯) return解题思路四重循环枚举每个人是/不是罪犯的所有组合检查是否只有一个罪犯评估每个人的陈述真值统计真话数量找出符合条件的组合这个例子展示了多重循环在解决复杂逻辑问题中的强大能力。虽然看起来有些暴力但对于小规模问题非常有效。