把大学时写的 Python 作业交给 AI 编程智能体:它指出的问题我当年全没发现

翻出大学时写的二分查找、中缀转后缀和牛顿迭代三份 Python 作业交给 AI 编程智能体,它找出了边界、结合性和停止条件等多处隐患,让小编学到比课程更多的东西。

大学时写的 Python 作业,能跑出预期结果就交差,从没回头想过有没有更好的写法。最近小编翻出三份旧脚本交给 AI 编程智能体:二分查找、基于栈的表达式转换、牛顿迭代法。结论先说:它不仅修好了小编当年没发现的错误,还一步步讲清楚原因,小编从中学到的比当年上课还多。

二分查找:几个测试通过,远远不够

第一份是数据结构与算法课的二分查找:对有序列表取中间元素比较,不断缩小范围。小编的实现用了常见的 low、high、mid 三个变量,印象里一直运行正常。

智能体先运行程序,用各种输入测试,到边界情况时就出问题了:查找位于列表开头或结尾的元素、查找不存在的元素、空列表,原代码都有隐患。这些主要是差一错误(off-by-one)和边界更新不当,比如 low 或 high 更新错了,会让程序直接跳过某个元素。智能体讲清了循环条件为什么重要,修正后又跑一遍同样的测试来验证。

小编当年的做法是随便跑几组输入,输出对上就算完成;而智能体是专门去找能把程序搞崩的输入,还补上了自动化测试,这是小编当年写作业时从没做过的。

栈的作业:我当年只是背下了逻辑

第二份是中缀转后缀表达式:把 A+B*C 转成 ABC*+,运算符放在操作数后面,过程中用栈记录运算符及其优先级。小编还记得当时花在“回忆逻辑”上的时间比理解多,代码对简单表达式能用,就以为实现对了。

智能体一测,发现嵌套括号和同优先级运算符的情况有问题;还有乘方的结合性:A^B^C 应当按 A^(B^C) 处理,小编的实现没处理对。小编又让它对 A*(B+(C-D)) 逐步讲解每一次栈操作,什么时候入栈、什么时候出栈、括号为什么会改变运算顺序。这个讲解让小编真正理解了以前主要靠背下来的算法。智能体还整理了实现,加了对非法表达式的检查。

牛顿迭代:只有公式还不够

AI 讲解 Python 脚本中的缺陷

第三份是数值方法课的平方根计算器,用牛顿-拉夫森迭代法,每次迭代逼近一点,直到达到指定精度。对 25 或 2 这样的数字没问题,但遇到很小或很大的数就不对了,部分原因是停止条件定义得不好:根据输入,程序可能还没达到足够精度就停了,也可能白白多跑很多轮。

智能体还指出脚本没有妥善处理零和负数,于是加了输入校验、改进了停止条件,并增加最大迭代次数,避免无限运行。它还把结果和 Python 内置的 math.sqrt() 做对比,解释精度差异。小编以前只把牛顿法当成要实现的公式,没想过初始猜测值、浮点精度和停止条件,即使公式没错,也会影响结果。

小结:真希望当年就这么做

追问智能体为什么这么改,比小编预想的学到更多。要是大学时就能这样,就能把时间花在理解自己写的代码上,而不是做完作业就走。想自己试试,可以看 Python 官方 math 模块文档 和 unittest 测试文档。

常见问题(FAQ)

什么叫差一错误?

就是循环边界或下标多算或少算了一个,二分查找里很常见。

拿旧作业给 AI 练手有什么好处?

您熟悉原来的思路,更容易看懂它指出的问题和改法,学得快。

应该让 AI 直接改还是先问原因?

先问原因,再看改动,这样才是学,直接照单全收就浪费了机会。

写测试真的有必要吗?

有,边界输入往往最容易暴露问题,自动化测试能让改动后重复验证。