买了一本书《Programming pearls》编程珠玑(88上的数学题目(1))

我觉得这真是一本不错的书,正是符合我的喜好的一本书。恩,所以我还是买了原版回来,尽管我的英文水平有些差劲。我注意到有网上一个人评论说,里面有些雕虫小技而已,对于大的项目可能不适用,或者在现代计算机内存,cpu速度都很强的情况,有些问题不那么在乎了。
我对这个评价觉得很不满意,尤其是将“智慧”所称雕虫小技,更是感到不认可。我觉得这本书想讲解的其实不是投机取巧的东西,而是完全为了是锻炼程序员的思想层次上的东西。这些也是决定一个程序员素质高低的关键。
技术可能会更新,涌现新的语言,工具和方法,环境等等,但是思想则会更持久,而这本书主要叙述的是思想,视角,从这个层次上提高效率和优美性。

我也看到了另一本书,是effective系列中的effective c#,我觉得这本书也是我比较需要的,因为里面有一些问题可能我并不是非常清楚。它主要的是帮助不太了解这些问题的人了解这些问题,了解编译器的喜好和个性,从而让你更有效的使用这个IDE,让你了解影响你的代码效率的比较底层的对你透明的一些东西,从而可写出更符合编译器口味,更有效率的代码。这和思想和算法层次是不同的,这主要是从高级语言特性等方面来提高代码效率,教给你良好的习惯和摒弃不良的代码习惯。它的层次更接近应用层,与语言,ide特性更相关。

而pearls是比较抽象的,我在书中看到的叙述感到非常有趣,因为作者提出问题后经常会给这个问题实际中的例子,这就非常有信服力,让你觉得这些智慧确实有用!我很喜欢,因为这些绝非投机,而非小计,而是智慧!不然,你觉得算法是什么,它就是一种抽象的方法,一种很强的智慧操纵后的解决方法转换处理(从人的直观型逻辑思维习惯转换为代码的过程控制型习惯),一种智慧的结晶。

这本书里面提到另一个人提出了一句话,而这句话恰恰也是作者的想法:A problem that seems difficult may have a simple, unexpected solution. 我想我确实是不太信任别人的翻译的,所以我要买回原版。因为中文表义具有一种模糊性,就是模棱两可,而英文表义具有一种确定性,即它的一些动词的语态与时间,被动等等结合,它可以更准确无歧义的进行描述。而且中文译者里面的素质也是良莠不齐的,可能得到公认和信任的也就是侯捷先生了,从他在前面列出一系列的词语对照和原因解释就能看出他的责任心和工作态度。回过来这句话,一个看起来很困难的问题,可能具有一个简单的出人意料的解法。嗯,我想这句话来描述优美的算法和代码非常恰当!

——————————————
比如说我在88上遇到的这个问题:
1,1,2,2,3,3,4,4,5,5这十个数字,要求排成一排,是两个1之间有1个数字,两个2之间有2个数字,...,两个5之间有5个数字。

怎么排呢?你可以在纸上尝试一下,无论如何,你都做不出结果,因为这道题无解。
怎么证明它无解呢?老实说,我虽然看到提示说用奇偶性证明,但是我没有想出怎么回事,而是用tc遍历搜索了一下发现没有任何输出。证明的方法我觉得这也可以说是另一种智慧能力的体现了,但是其实过程很简单:如果给 10 个数字从 1 到 10 进行连续编号,则显然这组编号必定由 5 奇数 5 偶数组成。
我们假设具有一个解满足题目要求,现在我们再次对这个解从 1 到 10 重新编号(显然仍由 5 个奇数编号和 5 个偶数编号组成):

那么考虑这个解里面的局部(子串):
1*1, 3***3, 5*****5,  这三对的数字(1,3,5)的编号的奇偶性相同。也就是(奇奇,或偶偶)* 3;
2**2, 4****4, 这两对数字(2,4)的编号的奇偶性不同。也就是说(是1奇1偶)* 2;


可见,解的编号具有偶数个偶数和偶数个奇数,和 5 奇 5 偶矛盾!因此无解。
证毕。

上一篇:终于解决了在c#里面用鼠标查找窗口的问题,原来如此简单


下一篇:Led控件(2)——Led显示屏模拟