你每天都在执行算法,只是自己不知道
你有没有遇到过这种情况?早上出门前,你下意识地完成了一系列动作:拿起钥匙、检查手机、换鞋、关门、按电梯。如果把这些步骤写下来,它就是一个人生小算法——只是你从来没用“算法”这么严肃的词称呼它罢了。
很多人一听到“算法”两个字就头皮发麻,觉得那是程序员和数学天才的专属。但真相是,算法没那么高冷。它就是你每天在做事的步骤,只不过计算机需要用一种更精确的语言把它写出来。
算法就是菜谱,计算机是执着的厨师
算法到底是什么?拆开来看,它只需要满足三个条件:明确、有序、可完成。就像做一道红烧肉,你需要:1)准备五花肉和调料;2)切块焯水;3)炒糖色;4)加酱油炖煮。顺序错了不行(先煮再炒糖色?那肉会变焦糖布丁),步骤模糊也不行(“放一点盐”对计算机来说等于没说)。
在计算机世界里,算法就是写给最死板厨师的菜谱。它不懂“稍微往左一点”这种话,它只认“向左移动5像素”——精确到数字。而我们用来跟这个死板厨师沟通的语言,就是C++。
一个最简单的“菜谱”:计算两数之和
来,看看最基础的一个算法长什么样。假设我要计算两个整数的和:
- 输入两个整数 a 和 b
- 把 a 和 b 加起来,得到 sum
- 输出 sum
用C++写出来就是:
int a, b;
cin >> a >> b;
int sum = a + b;
cout << sum << endl;
三行代码,对应三个步骤。每一步都清晰得不会被人质疑。这就是算法的本质:把一个大问题拆成计算机能理解的原子操作。
菜谱类比,到底在考什么?
现在回头看一道典型的考察题:“将算法比作菜谱,以下哪个说法最恰当?”(选项我就不列了,但给你个思路)
这道题的核心是在考察你对算法本质的理解。菜谱的根本价值是什么?不是食材有多高级,而是它给出了一组确定的步骤,按着做就能得到预期结果。所以正确的说法一定是强调“步骤的明确性和有序性”,而不是“菜谱只有一种”或“菜谱可以随意改”。算法允许不同实现,就像红烧肉有东坡版和毛氏版,但核心步骤不能丢。
再来看另一道题:“算法必须至少有一个输入。”这个说法对吗?
我猜很多人会选对,因为觉得算法总得“吃进去”点什么。但事实上,算法可以没有输入。例如,一个算法用来获取当前系统时间并显示,它不需要任何外部输入——它自己就能凭空产生输出。输入不是算法的必要条件。这个概念的陷阱在于,我们习惯了“输入→处理→输出”的三段式,但现实中确实存在“零输入”的算法,比如生成一个随机数。
如何真正学会“写菜谱”?
很多人学算法一开始就扑到代码上去,结果写得像天书。我教学生的顺序是:
- 先用自然语言说清楚——就像你跟朋友描述怎么泡面
- 再用伪代码过一遍——把“倒热水”写成“将100°C水注入容器”
- 最后翻译成C++——这时候你只是在填语法细节
很多初学者卡在第三步,其实是第一步没做透。你连红烧肉先放肉还是先放油都没想清楚,直接写代码就是找死。
一点进阶建议
如果你已经掌握了“写菜谱”的基本功,下一个阶段是去思考:同一个菜,有几种不同的炒法?每种炒法的效率如何? 这就是算法的复杂度分析。比如排序一个列表,你可以用冒泡排序(像拿筷子一粒粒挑豆子),也可以用快速排序(像用漏勺过水)。前者简单但慢,后者复杂但快。没有绝对的好,只有适不适合当前场景。
算法世界的大门,其实从你生活里的每一个决定就已经打开了。剩下的,只是学会用C++把它写清楚而已。
关于作者
我是赵老师,持有 NOI 信息学奥赛教练证书,拥有 15 年以上的软件开发经验,从事信息学少儿编程教学已有 8 年时间。
这些年累计帮助 多名 学生通过编程特长升入自己心仪的目标学校。
如果你在编程学习上有任何疑问,欢迎联系我:18620372957(微信同号)