古人早在3000年前就在玩算法?埃及分数的惊人发现
古人的代码:埃及分数里的算法智慧
你写递归函数的时候,有没有想过这套思路最早是谁想出来的?
答案是几千年前的古埃及人。
今天要聊的埃及分数,听起来可能有点冷门,但它其实是一种超级古老的算法,而且里面的思路跟你平时写代码用到的没什么两样。
古埃及人头疼的问题
咱们现在写分数太顺手了:3/7、5/12,直接怼上去就行。
但你知道吗?欧洲人要到18世纪才习惯这种写法。在那之前,数学家们表达分数的方式是把它拆成一堆"单位分数"——就是分子是1的分数,比如1/2、1/5、1/13。
那问题来了:7个面包分给8个人,怎么分才公平?
古埃及人可不写7/8,他们的答案是:
1/2 + 1/4 + 1/8
一个人拿一半,一个人拿四分之一,两个人各拿八分之一,齐活。
这个看起来简单的拆分,其实藏着很精妙的数学思想。
这不就是贪心算法吗?
重点来了。
古埃及人用来拆分任意分数的方法,跟咱们现在说的贪心算法本质上是一回事:
每一步都选最大的单位分数,然后从剩下的部分继续拆。
来,手把手演示一遍,比如要把4/23拆成埃及分数:
- 问自己:23除以4等于多少?答案是5.75
- 找个比这个数大的最小整数,就是6
- 所以第一个单位分数是1/6
- 从4/23里减去1/6,还剩1/138
- 搞定:4/23 = 1/6 + 1/138
这个方法永远能跑通。1880年有人严格证明了这件事,但欧洲人其实早在12世纪就从斐波那契那里学到了这招。
跟写代码的关系
你可能觉得这是历史知识,跟日常工作没半毛钱关系。
但仔细想想,刚才那个算法里面藏了什么?
- 递归分解 —— 把复杂问题拆成更小的子问题
- 贪心选择 —— 每一步都做当前最优的选择
- 终止证明 —— 保证每一步剩下的都更小,迟早能结束
这几个概念,恰恰是现代算法思维的核心。
你写递归函数的时候脑子里想的逻辑,跟古埃及数学家几千年前想的一模一样。只不过他们用泥板,你用键盘。
被人遗忘的贡献
有件事得说清楚。
埃及分数这套方法,比古希腊数学早了好几千年。但19世纪欧洲人重新发现莱因德纸草书的时候,很多文献把功劳算到了希腊人头上。
这种把非洲和其他非欧洲文明的贡献淡化甚至抹掉的做法,到现在学计算机历史的时候还能看到。
这事值得琢磨一下。
有意思的数学谜题
再讲个有趣的。
有些学者提到了"埃及三元组":13、17、173。
如果把它们拼成这样的算式:
3 + 1/13 + 1/17 + 1/173
算出来的结果能精确到小数点后四位——比通常说的埃及π值3.16还准。
这是古人故意算出来的,还是纯属巧合?历史学家到现在还在吵。
从泥板到代码
说回正经的。
埃及分数跟连分数有直接的数学联系,而这玩意儿在今天的计算机科学和数论里还在研究。贪心算法的思路也被用在了资源分配、任务调度、优化问题等各种地方。
所以下次你调试递归函数,或者跟同事解释为什么贪心策略能work的时候可以想想:
你参与的这个数学传统,已经有将近4000年历史了。
有时候,最古老的算法,反而最经得起时间考验。