Skip to content

Commit 7f28d9f

Browse files
committed
docs: update algorithm-stories.md
1 parent 7ca871a commit 7f28d9f

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

docs/algorithm-stories.md

+36-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44
55
- [“红色眼睛与褐色眼睛”谜题](#红色眼睛与褐色眼睛谜题)
66
- [找出剩下的一个数](#找出剩下的一个数)
7-
- [说出2199年7月2日是星期几?](#说出2199年7月2日是星期几)
7+
- [说出2199年7月2日是星期几](#说出2199年7月2日是星期几)
8+
- [梅森素数](#梅森素数)
9+
- [杯中的水是否超过一半](#杯中的水是否超过一半)
810

911
## “红色眼睛与褐色眼睛”谜题
1012
从前,有个小岛上只住着和尚。有些和尚的眼睛是红色的,而另一些则是褐色的。红色眼睛的和尚受到诅咒,如果得知自己的眼睛是红色的,那么当晚 12 点必须自行了断,无一例外。
@@ -13,6 +15,8 @@
1315

1416
有一天,岛上突然来了一位游客,她完全处于状况外。于是,她对和尚们说:“你们当中至少有一位的眼睛是红色的”。
1517

18+
![island-eye-color](island-eye-color.jpg)
19+
1620
这名无心的游客当天就离开了小岛,而和尚们却因第一次听到有关眼睛颜色的话题而惴惴不安。当晚,小岛上开始出现了可怕的事情......
1721

1822
究竟是什么事呢?
@@ -126,4 +130,34 @@ boolean isLeapYear(int year) {
126130

127131
这道题看似简单,但其实不仅需要了解“末日”算法,还需要深入了解上述模式。上面的日历中,2199 年的“末日”是星期四,所以 2199.7.11/2199.7.4 也是星期四,所以 2199.7.2 是星期二。
128132

129-
感受到康威教授末日算法的精妙之处了吧。
133+
感受到康威教授末日算法的精妙之处了吧。
134+
135+
## 梅森素数
136+
马林•梅森是法国哲学家、修道士,
137+
138+
16 世纪,数论领域存在着一个错误的假设,而一直被认为是事实。根据这个假设,对所有素数 p,2<sup>p</sup>-1 也是素数。将素数 2,5,7 带入,结果均为负数。
139+
140+
从直观角度看,对素数 p,总有 2<sup>p</sup>-1 也是素数的假设成立。不过,仅仅通过几个结果就想判断命题真伪,这在数学中是最“无知”的行为。这种代入几个变量进行的测试往往以程序能够正常运行的“晴天”作为前提条件,如果遇到“雨天”,这种只经过松散测试的程序会发生很多意想不到的问题。算法的内部逻辑应该紧凑,不给 Bug 任何可乘之机。
141+
142+
后来,人们最终证明,p 为素数时,2<sup>p</sup>-1 的结果不一定是素数。虽然如此,有些人还是好奇,p 是什么样的素数时,2<sup>p</sup>-1 结果将为素数。为了解答这种好奇,梅森在 1644 年发表的论文里提出了如下主张:
143+
144+
> “若 p 为 2、3、5、7、13、17、19、31、67、127、257 之一,那么 2<sup>p</sup>-1 的结果是素数。”
145+
146+
梅森一直希望将存在的所有素数都表示为 2<sup>p</sup>-1 这种短小而精简的公式形式。若真能找到那样一个公式,将是美丽得让人窒息的、绝妙的数学发现。不过,梅森的梦想没能实现。
147+
148+
随着时间的流逝,后世数学家们通过计算得出,应当删除梅森假设中的 67 和 257,而可以添加 61、89、107。就这样,从前简洁而“有理”的命题 “若 p 是素数,则 2<sup>p</sup>-1 也是素数” 已消失不见,而留下的 “p 为某值时,结果为素数,否则不是素数”等杂乱的 if-else 语句正让算法变得越来越杂乱不堪。
149+
150+
实际编程中,如果越来越复杂的 `if-else` 语句影响程序简洁性,那么到了某一时刻,程序员就会考虑“重构”,对于算法也是一样。后来,人们将精简的新算法献给一生都在祈祷和学习的修道士梅森:
151+
152+
> “如果 p 为素数时 2<sup>p</sup>-1 也是素数,那么此素数为梅森素数。”
153+
154+
## 杯中的水是否超过一半
155+
空房间中有个圆柱形水杯,杯口和杯底直径相同,里面有半杯左右的水。找出方法,判断杯中水超过一半还是不到一半。空荡荡的房间中没有任何可使用的器具或工具。
156+
157+
答案本身非常简单,不过能够真正求解的人却寥寥无几。想问题的时候,请不要考虑房间或水的温度,以及化学反应等“不讲理”的方法。另外,不允许喝杯子里的水。
158+
159+
![water-cup](/images/water-cup.jpg)
160+
161+
即使读完题没能马上想起答案,但看到插图后能够立刻明白,也可以说很有编程的感觉。将杯子倾斜,使水面刚好到达杯口时,查看杯底的水就能得出答案了。
162+
163+
算法的编写与之大体相同。各位因为找不到突破口而郁闷时,甚至会怀疑给出的问题究竟有没有解。然而找到突破口后,再回首会发现,原来解决之道竟如此简单。

images/island-eye-color.jpg

2.56 MB
Loading

images/water-cup.jpg

1.66 MB
Loading

0 commit comments

Comments
 (0)