Skip to content

Commit

Permalink
docs: update algorithm-stories.md
Browse files Browse the repository at this point in the history
  • Loading branch information
yanglbme committed Feb 25, 2019
1 parent 7ca871a commit 7f28d9f
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 2 deletions.
38 changes: 36 additions & 2 deletions docs/algorithm-stories.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@
- [“红色眼睛与褐色眼睛”谜题](#红色眼睛与褐色眼睛谜题)
- [找出剩下的一个数](#找出剩下的一个数)
- [说出2199年7月2日是星期几?](#说出2199年7月2日是星期几)
- [说出2199年7月2日是星期几](#说出2199年7月2日是星期几)
- [梅森素数](#梅森素数)
- [杯中的水是否超过一半](#杯中的水是否超过一半)

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

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

![island-eye-color](island-eye-color.jpg)

这名无心的游客当天就离开了小岛,而和尚们却因第一次听到有关眼睛颜色的话题而惴惴不安。当晚,小岛上开始出现了可怕的事情......

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

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

感受到康威教授末日算法的精妙之处了吧。
感受到康威教授末日算法的精妙之处了吧。

## 梅森素数
马林•梅森是法国哲学家、修道士,

16 世纪,数论领域存在着一个错误的假设,而一直被认为是事实。根据这个假设,对所有素数 p,2<sup>p</sup>-1 也是素数。将素数 2,5,7 带入,结果均为负数。

从直观角度看,对素数 p,总有 2<sup>p</sup>-1 也是素数的假设成立。不过,仅仅通过几个结果就想判断命题真伪,这在数学中是最“无知”的行为。这种代入几个变量进行的测试往往以程序能够正常运行的“晴天”作为前提条件,如果遇到“雨天”,这种只经过松散测试的程序会发生很多意想不到的问题。算法的内部逻辑应该紧凑,不给 Bug 任何可乘之机。

后来,人们最终证明,p 为素数时,2<sup>p</sup>-1 的结果不一定是素数。虽然如此,有些人还是好奇,p 是什么样的素数时,2<sup>p</sup>-1 结果将为素数。为了解答这种好奇,梅森在 1644 年发表的论文里提出了如下主张:

> “若 p 为 2、3、5、7、13、17、19、31、67、127、257 之一,那么 2<sup>p</sup>-1 的结果是素数。”
梅森一直希望将存在的所有素数都表示为 2<sup>p</sup>-1 这种短小而精简的公式形式。若真能找到那样一个公式,将是美丽得让人窒息的、绝妙的数学发现。不过,梅森的梦想没能实现。

随着时间的流逝,后世数学家们通过计算得出,应当删除梅森假设中的 67 和 257,而可以添加 61、89、107。就这样,从前简洁而“有理”的命题 “若 p 是素数,则 2<sup>p</sup>-1 也是素数” 已消失不见,而留下的 “p 为某值时,结果为素数,否则不是素数”等杂乱的 if-else 语句正让算法变得越来越杂乱不堪。

实际编程中,如果越来越复杂的 `if-else` 语句影响程序简洁性,那么到了某一时刻,程序员就会考虑“重构”,对于算法也是一样。后来,人们将精简的新算法献给一生都在祈祷和学习的修道士梅森:

> “如果 p 为素数时 2<sup>p</sup>-1 也是素数,那么此素数为梅森素数。”
## 杯中的水是否超过一半
空房间中有个圆柱形水杯,杯口和杯底直径相同,里面有半杯左右的水。找出方法,判断杯中水超过一半还是不到一半。空荡荡的房间中没有任何可使用的器具或工具。

答案本身非常简单,不过能够真正求解的人却寥寥无几。想问题的时候,请不要考虑房间或水的温度,以及化学反应等“不讲理”的方法。另外,不允许喝杯子里的水。

![water-cup](/images/water-cup.jpg)

即使读完题没能马上想起答案,但看到插图后能够立刻明白,也可以说很有编程的感觉。将杯子倾斜,使水面刚好到达杯口时,查看杯底的水就能得出答案了。

算法的编写与之大体相同。各位因为找不到突破口而郁闷时,甚至会怀疑给出的问题究竟有没有解。然而找到突破口后,再回首会发现,原来解决之道竟如此简单。
Binary file added images/island-eye-color.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/water-cup.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 7f28d9f

Please sign in to comment.