春节结束从老家回到上海的时候,买到的是临客的火车,坐了26个小时。小腿都坐肿了,但是也一口气看完了结城浩写的这本《程序员的数学》。不得不说,小日本这个国家是挺讨厌的,但是结城浩这个日本人写的书还是不错的。看了这本书,让我理解了很多以前在学校中不是很理解的东西,这里挑选了一些有意思的记录下来,以后有空还可以看看。
1、两个开关控制一个电灯,不管那个按下都能控制灯的状态,这是个初中物理的问题,也是生活中经常遇到的问题,但是一直对原理不是很明白,书里有个非常明白且简单的电路图-图2-17表示异或的电路图
2、使用卡诺图可以化简多条件的复杂的逻辑规则。
3、奇偶校验的实现。很早就知道奇偶校验是网络通信中经常使用的一种方法,但是很少看到具体的实现讲解,书中给了个黑白棋(棋子一面是白色的,另外一面是黑色的,等效于二进制的0和1)的例子,很简单,也很清晰,这里摘录如下:
魔术师和他的徒弟在台上表演,下面有N多观众,魔术师蒙着眼。
(1)在桌子上随机排列着7枚黑白棋的棋子;
(2)魔术师的徒弟在看完这7枚棋子后,又添加了一枚棋子,这时总数是8枚棋子;
(3)这时观众可以将8枚棋子中的任何一枚翻转,或者不翻转任何棋子:
(4)之后,魔术师摘下眼罩,只要看一眼8枚棋子,就马上能说出“观众翻转了棋子”或者“观众没有翻转棋子”,准确的识别出观众的行为。
原理如下:
魔术师和徒弟虽然没有用语言交流,但是通过添加一枚棋子的方式进行了交流。
徒弟在观众前7枚棋子中数出黑棋的个数,如果是奇数就添加黑棋,如果是偶数就就添加白棋,添加后的8枚棋子中黑棋的个数必为偶数个。
此时观众的行为可以是一下任何一种:
A观众翻转白棋,那么,黑棋就增加了一枚,即黑棋变为了奇数个;
B观众翻转黑棋,那么,黑棋就减少了一枚,黑棋也变为了奇数个;
C观众不翻转任何棋子,黑棋仍然是偶数个。
所以,魔术师摘下眼罩后,只要数一下黑棋的个数,如果是奇数就说“观众翻转了棋子”,否则就说“观众没有翻转棋子”。
当然这里徒弟摆放棋子使“黑棋个数为偶数”,换成“黑棋个数为奇数”或“白棋个数为偶数”或“白棋个数为奇数”都行,只要事先商量好就行。
总结:这里将白棋作为二进制的0,黑棋作为二进制的1,徒弟是发送方,魔术师是接收方,徒弟放置的第8位作为奇偶效验位,这就是通信中的奇偶校验了。当然中这里可以看出,奇偶校验并不能完全准确的效验通信是否正确,因为这里只允许观众翻转1枚棋子或者不翻转任何棋子,如果观众翻转1枚以上的棋子就不行了。
4、高斯算法的发现。以前学校里只讲了高斯发现了公式:等差数列之和=(首项+末项)*项数/2,没有讲怎么发现的,即使讲也只是说1加100是101,2加99是101等等。书里给了个简单的解说:
1+ 2+ 3+...+ 99+100
+)100+ 99+ 98+...+ 2+ 1
--------------------------------
101+101+101+...+101+101
此处一共100个101,即2个数列的和为101*100=10100,所以一个数列的和为10100/2=5050。
即:和=(首项+末项)*项数/2。
5、6层汉诺塔的递归解法。
第一层递归:
(1)首先,将5个圆盘从A柱移动到C柱(相当于解5层汉诺塔);
(2)然后,将6个之中最大的圆盘从A柱移动到B柱;
(3)最后,将5个圆盘从C柱移动到B柱(相当于解5层汉诺塔);
第二层递归:
(1)首先,将4个圆盘从A柱移动到C柱(相当于解5层汉诺塔);
(2)然后,将5个之中最大的圆盘从A柱移动到B柱;
(3)最后,将4个圆盘从C柱移动到B柱(相当于解5层汉诺塔);
...
最后一层递归:
(1)首先,将1个圆盘从A柱移动到C柱(相当于解5层汉诺塔);
(2)然后,将2个之中最大的圆盘从A柱移动到B柱;
(3)最后,将1个圆盘从C柱移动到B柱(相当于解5层汉诺塔);
翻译成伪代码:
将n个圆盘从x柱,经由z柱中转,移动到y柱(解出n层汉诺塔)时:
当n=0时
不用做任何动作
当n>0时
首先,将n-1个圆盘从x柱,经由y柱中转,移动到z柱(相当于解n-1层汉诺塔);
然后,将1个圆盘从x柱移动到y柱;
最后,将n-1个圆盘从z柱,经由x柱中转,移动到y柱(相当于解n-1层汉诺塔)。
C代码实现:
#include <stdio.h>
#include <stdlib.h>
void hanoi(int n, char x, char y, char z);
void hanoi(int n, char x, char y, char z)
{
if(n==0){
return;
}else{
hanoi(n-1,x,z,y);
printf("%c->%c, ", x, y);
hanoi(n-1,z,y,x);
}
}
int main(void)
{
hanoi(6, 'A', 'B', 'C');
return 0;
}
6、成正三角形排列的杨辉三角形的奇偶数分色标识就是谢尔平斯基三角形-图6-17。
7、指数爆炸引发的难题-不能认为是“有限的”就不假思索。当然如果问题是有限的,并且可以做到一个不漏的解决,那么只要运行计算机总会处理完。但是如果需要花上几千年的时间才能解决,这种“解决”就对人类没有意义了。一个问题不仅要在“有限的时间”里,更要在“短时间”内解决,这一点至关重要。
因此,如果问题中包含指数爆炸,就不能简单的采用穷举法来解决。