💻 第四章 程序像河水一样流动着
📄 一句话概括

算法先用图画清楚、再用代码写出来:求最大值、判断闰年这类小题,画完图测试数据自然就全了。

📝 本节和前面几节的关系

图纸(流程图)和积木(结构化)都备好了,这一节演示【怎么用它们思考】——画图即思考。

一、为什么先画图

写代码时会陷入细节(变量名、语法),画流程图只面对【逻辑】——哪一步判断、走哪条路。 图对了,代码只是翻译;图错了,代码越写越乱。教材主张:算法的功夫一半在图上。

二、实例:求三个数的最大值

思路很笨但很稳:把第一个数暂定为最大值,然后依次拿后面的数跟它比,谁大就把最大值换成谁。 流程图就是【处理-判断-处理-判断-处理】一条线加两个岔路,每个岔路两条出口——画完逻辑就没有死角。

三、实例:判断闰年

闰年规则:能被 4 整除但不能被 100 整除,或者能被 400 整除。 画成流程图是【菱形套菱形】:第一层问【能被 4 整除吗】,否直接判平年;是再问【能被 100 整除吗】,能再问【能被 400 整除吗】。 嵌套判断画在图上层层分明,直接写代码则容易把三个条件揉成一团——这就是先画图的好处。

四、动手 Demo:求最大值+闰年判断双验

把两道经典小题连同测试数据一起跑一遍,重点看【每个岔路都想到了】。

# 求三个数的最大值
def max3(a, b, c):
    m = a
    if b > m: m = b
    if c > m: m = c
    return m
print([max3(*t) for t in [(3,7,5), (9,2,4), (1,2,8), (5,5,5)]])
# 闰年判断
def leap(y):
    return (y % 4 == 0 and y % 100 != 0) or y % 400 == 0
print([(y, leap(y)) for y in (1900, 2000, 2024, 2026)])

实跑输出:

--------------------------------------------------------------------
先画图,再写码——求三个数的最大值
--------------------------------------------------------------------

算法思考的规矩:先画流程图,再落成代码。以【求三个数最大值】为例:

    1. 把第一个数暂定为【最大值】
    2. 若第二个数比它大 -> 最大值换成第二个数
    3. 若第三个数比它大 -> 最大值换成第三个数
    4. 输出最大值

流程图就是【处理-判断-处理-判断-处理】一条直线加两个岔路:

    [max = a] -> < b > max ? > --是--> [max = b]
                        |否
                        v
                  < c > max ? > --是--> [max = c]
                        |否
                        v
                  [ 输出 max ]

三类测试数据当场验一遍:
  输入      路线                   输出
  --------------------------------------
  3,7,5     两个判断各走各的道     7
  9,2,4     两个判断各走各的道     9
  1,2,8     两个判断各走各的道     8
  5,5,5     两个判断各走各的道     5

注意最后一组:三个数相等时,两个判断都走【否】——流程图的每个岔路都想到了,
测试数据才会这么全面。这就是【先画图】的价值。

测试数据要专门挑边角:(5,5,5) 考相等的情况、1900 考【整百年不是闰年】——图上每个岔路都得有数据走一遍。 闰年的三个条件写在代码里是一条 and/or 表达式——它对应流程图里三层嵌套菱形,两者是同一逻辑。

30 秒实验

  1. 给 max3 再加一个参数(求四个数的最大值),先在纸上改流程图,再改代码。
  2. 找一年(比如 2100)跑一遍闰年判断,说说为什么它不是闰年。

常见误区

  1. 不画图直接写代码——题目简单时侥幸能过,题目一复杂就翻车。
  2. 画了图不测边角——(5,5,5) 和 1900 这种数据专门抓【漏掉的岔路】。
自测三问(点开对答案) 1. 为什么先画图再写代码? —— 图画的是逻辑,代码混着语法细节——先理清逻辑,代码只是翻译。 2. 闰年规则怎么说? —— 能被 4 整除且不能被 100 整除,或者能被 400 整除。 3. 为什么要挑边角数据测试? —— 边角数据专门检验流程图里容易漏掉的那几条岔路。

相关笔记