欢迎来到算法设计的世界!
你有没有想过电脑是怎样“思考”的?其实它并没有像我们一样的大脑,它只是遵循一套非常具体的指令,我们称之为算法(Algorithm)。你可以把算法想象成一份食谱:如果你严格按照步骤操作,就能做出美味的蛋糕;但如果漏掉一个步骤,情况可能就会一团糟!
在这个章节中,我们不仅仅是在学习编写程序,我们还在学习如何设计解决方案。我们将探讨每一位程序员都必须掌握的常见“食谱”,并学习如何将困难的大问题拆解成简单的小问题。如果刚开始觉得有点复杂,别担心——看完这些笔记,你就会开始像专业程序员一样思考了!
1. 建立你的逻辑:核心算法
在 Python 中,有像 min() 或 sum() 这样的内置捷径。然而,要成为一名出色的计算机科学家,你需要了解这些功能在“底层”是如何运作的。让我们看看如何从零开始构建它们吧!
A. 寻找最大值(Maximum)或最小值(Minimum)
类比:想象你手边有一叠写着数字的卡片,共 100 张。你一次只能看一张卡片。你要怎么找出最大的一张?你可能会把目前为止见过最大的那张拿在左手,然后用右手拿取新卡片来进行比较。
步骤解析:
1. 选取列表中的第一项,将其命名为 current_max(当前最大值)。
2. 逐一浏览列表中的其余项目。
3. 对于每个项目,询问:“这个项目比我的 current_max 大吗?”
4. 如果是,则将 current_max 更新为这个新项目。
5. 如果否,则直接跳到下一个项目。
6. 当你到达列表末端时,你的 current_max 就是赢家!
常见错误:如果你的列表可能包含负数,千万不要将 current_max 的初始值设为 0!从列表的第一项开始设定总是比较安全的。
B. 计算总和与平均值
“累加(Running Total)”技巧:要计算总和,想象你有一个存钱罐。每当你在列表中看到一个数字,就把那个金额投进存钱罐里。
公式:
要计算平均值,你可以使用这个简单的数学式:\( Average = \frac{Total Sum}{Number of Items} \)
快速回顾:若要在没有捷径的情况下取得项目数量(Number of Items),你可以建立一个初始值为 0 的“计数器(counter)”变量,每看过一个项目就加 1。
C. 搜索项目
线性搜索(Linear Search):这就像在长长的队伍中寻找某个特定的朋友。你从队伍最前面开始,问每个人:“你是 Charlie 吗?”,直到找到他为止,或是走到队伍最后面。
逻辑:使用循环来检查每一个项目。如果你找到了匹配的对象,就记录它的位置(索引,index)并停止。如果你走到最后仍没找到,就可以告知用户该项目不存在。
D. 根据准则提取项目
有时候你只需要特定的项目——例如“所有大于 50 的数字”或“所有以 A 开头的名字”。
逻辑:建立一个新的空列表。透过循环浏览原始列表,对每个项目检查它是否符合你的准则(criteria)。如果符合,就将其“附加(append)”到你的新列表中。
E. 手动分割字符串
想象你有一个句子:"I-love-computing",你想要在每次看到连字符(-)时将单词分开。
逻辑:建立一个空的“字符串变量”和一个空的列表。查看每一个字符。如果该字符不是连字符,就将它加到你的“字符串变量”中。如果它是连字符,这代表单词结束了!将“字符串变量”加入到你的列表中,并将“字符串变量”重设为空值。
本节总结:大多数基础算法都遵循一种模式:初始化(Initialize)变量(例如最大值或总和)、循环(Loop)处理数据,并根据条件更新(Update)变量。
2. 处理大问题的聪明策略
当你面对复杂的项目时,不要试图一次写完所有代码。请使用这四种专业策略:
A. 模块化方法(分解 Decomposition)
类比:想想乐高积木。你不会把整座城堡当作一块巨大的砖块来盖,你会分别组装塔楼、城墙和大门,然后再将它们组合在一起。在计算机科学中,我们将程序拆分成小小的模块(modules)或函数(functions)。
为什么要这样做?修复一个坏掉的塔楼比修复整个坏掉的城堡要容易得多!
B. 增量方法(Incremental Approach)
概念:从程序最简单的版本开始,确保它完美运行。然后,一次慢慢增加一个新功能。
示例:如果你要制作一个计算器,先从制作“加法”开始。一旦运行正常,再加入减法。千万不要试图同时完成加、减、乘、除!
C. 先手动解决
你知道吗?你应该经常离开电脑,动手解决问题!如果你无法在纸上用铅笔解决问题的小型版本,你就无法告诉电脑该如何处理。
诀窍:亲手解决 3 到 4 个小示例。观察你采取的通用步骤,这些步骤就会成为你的算法!
D. 模式识别(Pattern Recognition)
策略:问问自己:“我以前看过类似的东西吗?”
如果你知道如何找出列表中的最大值,你就已经知道如何找出最小值了(只要把“大于”符号换成“小于”即可)。如果你会搜索数字,你就能搜索字符串。别重复发明轮子!
3. 快速回顾与小撇步
必须记住的关键术语:
算法(Algorithm):一系列逐步操作的指令。
准则(Criteria):用于筛选特定数据的规则或条件。
分隔符(Delimiter):用于分隔字符串中项目的字符(例如逗号或空格)。
迭代(Iteration):循环或重复步骤的另一种说法。
记忆口诀:“I.L.U.”
大多数算法都遵循 I.L.U.:
1. Initialize(初始化):先设定好你的变量。
2. Loop(循环):遍历数据。
3. Update(更新):必要时更改你的变量。
最后的鼓励:算法设计是一种技能,就像演奏乐器或运动一样。你练习这些任务的“手动”版本越多,感觉就会越自然。你一定没问题的!