美文网首页我爱编程
《枕边算法书》阅读笔记(2)

《枕边算法书》阅读笔记(2)

作者: 宇宙怪猫 | 来源:发表于2018-04-15 13:42 被阅读0次

        继续读书,发现了几句能让人产生共鸣的句子。“一名优秀的程序员并不是只坐在电脑前拼命编程的人,而应当喜爱接触新鲜事物,拥有广泛的兴趣爱好。因为,想象力只有通过接触生活中的各种事物才能得以丰富。”虽然我不算优秀的程序员,但我是认同这段话的。我自己除了工作编程之外,其他生活中兴趣也有很多,运动、养宠物植物、乐器等等,这些兴趣并不能直接的解决工作中遇到的问题,但是编写的程序其实最终是服务于人的。生活中除了编程以外,还有很多有意义的事情,不让自己成为一个游离在时代之外的人,接触生活中各种事物是很有必要的。而你与同事多聊聊热点事件、拔草某个美食、育儿经之类的,自己的沟通能力会不断提高,这种能力这对工作中的沟通,尤其是非技术人员提出需求时的沟通是非常有帮助的。

        另一段让我觉得不错的话是:编程并不像一个人玩的围棋或网球,更像是足球,需要整个团队的相互团结、相互配合,这样才终能成功。想要完成一个项目必须分工合作,所以不仅需要个人能力,更重要的是团队合作。无论程序员个人能力有多强,如果他独断专行,他就是项目组的弊端。相反,再弱的程序员也有超过别人的技能,重要的是有认真合作的态度,这才能成为项目的重要支柱。这个我也是有深入感触的,曾经在一个项目组,所有人都能力出众,每次遇到问题大家都是“深入交换意见”,也就是“各说各的,分歧很大,谁也说服不了谁”,当然,最后项目在大家陷入长期的加班后,黄了。我刚工作时,所在的团队能力层次很清晰,有大神,有几年经验的熟练工,也有我这样的新手,大家各司其职,推进项目的同时也能学习提高自身的能力。

        插播书中一题纯数学的,冯·诺依曼关于无穷级数的题:两列相距150英里的火车相向而行,第一列火车时速60英里,第二列火车时速90英里。第一列火车头上有一只苍蝇,先飞向第二列火车;到达第二列火车头后,又折返飞向第一列火车,如此往返,直到两车相遇。如果苍蝇的飞行时度是120英里,那么最后苍蝇飞行多远?

        接下去看了3个问题,逐个回忆一下。第一题:能保存99个数值的数组item[0], item[1],...,item[98]。有100个数{1,2,3,..., 100}。随机从这100个数中抽取99个保存到数组中,编写程序找出剩余的数值。书中用了一个很讨巧方法,因为1~100的和是5050,于是定义了一个int sum=5050; 然后for循环逐个减去item[i]的值,最后剩下的值就是那个没被保存进数组的数。这个方法是快捷的,但是实际中的大部分情况,我是不建议这么写的。首先直接定义一个int,这个5050其实就是传说中的“神秘数字”,如果不加注释,阅读这段代码的人很可能不知道这个5050是怎么来的。其次,可扩展性很差,现在是100个数取99个,如果是200个数取199个呢?如果是100个数取98个,分别找出剩余2个数呢?

        第二题是编写一段函数,判断输入的字符串是不是回文。这题其实很简单,但是书中也指出了示例代码中的可以优化之处,在for循环中,每次都要判断if(inputString[index] != inputString[length - 1 -index]), 此处应该在for循环之前就定义一个变量等于length-1,否则for每次循环都要计算一次length-1,这是降低运算效率的。

        第二题引申出了一个有趣的问题:①选择任意整数。②翻转此数字(例如选择13,翻转就变成了31),将两数相加(13+31)③相加结果如果不是回文,重复执行第②步,直到是回文为止。 例如:13+31=44,是回文,终止。19+91=110,110+011=121,是回文,终止。当有人提出:“是否所有数字都能找到对应的回文数”时,数字196出现了。学者们为了计算196可以说是非常疯狂了,有人计算到了7000万位,依旧看不到出现回文的任何征兆。其实196能否计算到回文这个问题没有太大意义,因为对人们的生活没有任何影响。但是即使如此,人们还是不愿放弃,依旧在探索196的秘密。人们就是有时会为了一些连“为什么”都不必问的事情贡献了自己的一生,有些人会选择自己看不到回报又充满冒险的旅程。很多算法都是经历过这种不问缘由的冒险才公诸于世的,向充满不确定因素探索未知世界的人,才能成为历史的主人。

        第三个问题:随便说个年月日,那天是星期几?为了解开第三题,书中介绍了“康威的末日算法”(Jhon Horton Conway,Doomsday算法)。这个算法其实并不复杂,设定了每年2月最后一天(2月28日或2月29日)为“末日”,其实就是一个参照。那么当年的4月4日、6月6日、8月8日、10月10日、12月12日,以及5月9日、9月5日、7月11日、11月7日、3月7日,这些天是与“末日”的星期几是一样的。以上这些内容,单独拿出来,也可以省去不少翻看日历的时间。如果是任意年份,也就是说只需要知道每年的“末日”是星期几,就可以推算出当年的任意日子是星期几。而这个的关键就是“闰年”和每年的“末日”是星期几的“找规律”上,这里就不再讨论了。当然,最后也可以参照书中缩写,自己探索“康威的末日算法”,写一套代码,输入任意年月日计算出输入的日期是星期几。

    相关文章

      网友评论

        本文标题:《枕边算法书》阅读笔记(2)

        本文链接:https://www.haomeiwen.com/subject/mvoxkftx.html