MIT 6.0001 Note
What is computation?
计算就像做菜 。你有原材料(数据),按照菜谱(算法)一步步操作,最后得到一盘菜(结果)。计算机就是个超级听话的厨师,你说什么它做什么,但它很”笨”——你得把每一步都说清楚,”加盐”不行,得说”加3克盐”。
Branching and Iteration
分支(if/else)= 人生的岔路口
走到路口,看天气:下雨→带伞,不下雨→不带伞。程序也一样,遇到条件就分岔。
python
if 下雨:
带伞()
else:
戴墨镜()
迭代(循环)= 刷碗
碗池里有10个碗,你得重复”拿起→洗→放下”这个动作10次。for循环就是”我知道要刷几个”,while循环是”刷到没碗为止”。
String Manipulation, Guess and Check, Approximations, Bisection
字符串 = 珠子串
“Hello”就是5颗珠子穿成的手链。你可以:
- 拿第3颗珠子(
s[2]) - 剪断重新串(切片)
- 把两条手链接起来(拼接)
猜测检查 = 猜价格游戏
“这个包多少钱?” 你从1元开始猜,一个个试,直到猜对。傻但管用。
二分法 = 撕字典找单词
要找”Python”这个词,你打开字典中间,看到”M”,知道P在后半部分,再撕开后半部分的中间… 每次排除一半,超快!
Decomposition, Abstractions, Functions
分解 = 吃大象
怎么吃掉一头大象?一口一口吃。大问题拆成小问题,大任务拆成小任务。
抽象 = 开车
你开车不需要知道引擎怎么运转,只要知道”踩油门→车快”就行。函数也一样,你调用print()不需要知道它怎么在屏幕上显示文字。
函数 = 榨汁机
def 榨汁(水果):
# 里面发生了魔法
return 果汁
苹果汁 = 榨汁(苹果) # 放苹果进去,出来苹果汁
Tuples, Lists, Aliasing, Mutability, Cloning
元组 = 密封罐头
(1, 2, 3) 一旦封装就不能改,想吃里面的桃子?可以看,但不能换成李子。
列表 = 购物车
[牛奶, 面包, 鸡蛋] 随时可以加东西、删东西、换东西。
别名 = 绰号
我的购物车 = [苹果]
你的购物车 = 我的购物车 # 我们推的是同一辆车!
你的购物车.append(香蕉) # 我的车里也多了香蕉
克隆 = 复印
你的购物车 = 我的购物车.copy() # 复印一份清单,各买各的
Recursion, Dictionaries
递归 = 俄罗斯套娃
打开一个娃娃,里面还有一个娃娃,再打开,又有一个… 直到最小的那个(基础情况)。
def 打开套娃(娃娃):
if 娃娃.是最小的:
return "找到了!"
else:
return 打开套娃(娃娃.里面的娃娃) # 自己调用自己
字典 = 真·字典
电话簿 = {
"张三": "123-4567",
"李四": "890-1234"
}
Testing, Debugging, Exceptions, Assertions
测试 = 出厂检验
造了一辆车,得试试刹车灵不灵、方向盘转不转。
调试 = 找蟑螂
代码里有bug(虫子),你得拿着手电筒(print语句)一行行找,或者用杀虫剂(调试器)。
异常 = 安全气囊
try:
开车()
except 撞车:
弹出安全气囊() # 出错了有补救措施
断言 = 质检卡尺
assert 这个零件长度 == 10cm —— 不对就立刻喊停生产线。
Object Oriented Programming
类 = 模具
想造一堆相同的月饼?做个模具(类),然后往里倒面糊:
class 月饼模具:
def __init__(self, 馅料):
self.馅料 = 馅料
def 烤制(self):
print(f"烤出了{self.馅料}月饼")
豆沙月饼 = 月饼模具("豆沙") # 造一个月饼
蛋黄月饼 = 月饼模具("蛋黄") # 再造一个
对象 = 流水线产品
每个月饼(对象)都有自己的馅料(属性),都能被烤(方法)。
Python Classes and Inheritance
继承 = 家族遗传
class 动物:
def 呼吸(self):
print("吸气呼气")
class 狗(动物): # 狗继承了动物
def 叫(self):
print("汪汪!")
我的狗 = 狗()
我的狗.呼吸() # 继承来的能力
我的狗.叫() # 自己的特殊能力
爸爸会呼吸,儿子天生也会;爸爸不会飞,但儿子可以学跳伞(添加新方法)。
Understanding Program Efficiency
不同算法 = 不同交通工具
- 走路去北京:O(n²) - 慢得离谱
- 开车去:O(n log n) - 还行
- 坐高铁:O(n) - 快
- 瞬移:O(1) - 一步到位
时间复杂度 = 速度等级
10个数排序 vs 100万个数排序,O(n²)算法会累死,O(n log n)依然飞快。
Searching and Sorting
线性搜索 = 一本本翻书找
图书馆1000本书,你从第一本开始翻,找《红楼梦》可能要翻500本。
二分搜索 = 利用书架编号
书是按字母排好的,直接去H区,一下缩小范围!(前提:必须排好序)
冒泡排序 = 泡泡上浮
最大的数像泡泡一样,一轮轮”咕噜咕噜”浮到最上面。
快速排序 = 站队游戏
选一个人当基准,比他高的站右边,矮的站左边,然后两边各自再这样分… 递归套娃!
Wrapping Up
- 建房子 :数据是砖,函数是工具,类是图纸,算法是工序
- 写小说 :变量是角色,条件是剧情分支,循环是重复的情节,递归是故事中的故事
- 管理公司 :对象是员工,继承是部门架构,调试是解决问题,效率是优化流程
记住:计算机很傻但很快,你得当个耐心的幼儿园老师,把每一步都讲清楚 🎓
有哪个比喻没听懂,或者想深入了解哪个部分吗?