前言
我们在刚开始接触编程时,只要跟着教科书学习,就能一点一点地学会很多东西。但学完基础内容之后,编程的进步速度就因人而异了。
对于工作中的项目开发,我们往往要按照客户的需求去推进,而且是与同事相互配合,按照技能分工协作的,所以通常不会出现什么大问题。在这个过程中,我们的个人技能也会一点一点地提高。但是,对于工作以外的项目开发,我们就可能在编程时碰壁。
譬如,有的人会不知道自己想做什么东西。这种情况在那些把编程当作学习任务的人中尤为常见。他们只是因为学校有这门课,或者将来可能会用到,所以才会去学习编程,并不知道自己真正想实现的是什么东西。因此,即便学习了编程,他们也不知道该如何应用所学的知识,而且缺乏坚持下去的动力。
有的人知道自己想做的是什么,但在具备了相应的能力后,却不知该如何下手。编程虽渐入佳境,但重复造轮子也没有意义。虽然想做一个新东西,但想不出来该怎么做,这可以说是缺乏“策划能力”的表现。
另外,那些知道自己想做什么,并且正在为了实现目标而努力学习的人,还会碰到另一个问题,那就是“永远无法实现的程序”。具体来说,就是他们想开发出高水准的程序,但要达到那种水准需要投入大量的时间,或者只靠一个人根本无法实现。
之所以会出现这些情况,是因为我们所处的世界已经获得了长足的发展。在没有 Windows 操作系统也没有互联网的年代,程序能做的事情非常有限。那时的 CPU 很慢,内存也不够大,人们能使用的只有控制台。在这种环境下,人们从教科书中学到的内容可以直观地与想要实现的程序联系起来。
但是,时代已经发生了天翻地覆的变化。设计精巧的智能手机应用、3D 游戏等相继面世,一旦习惯了这样的环境,我们学到的标准输入 / 输出和算法就很难与现实中的各种应用联系起来。
标准输入 / 输出和算法的知识非常重要,前者涉及程序内部的运行机制,后者则有助于我们调试程序。但是,如果我们想做的东西过于庞杂,理想和现实之间就会出现难以想象的鸿沟。一旦产生了“一直这么学下去,也不知道什么时候才能实现目标”的念头,学习就会原地踏步。
对于正受此类问题困扰的人而言,解答本书中的数学谜题也许能帮助你找到些许答案。本书中设置的问题非常明确,解答起来并不需要投入太多的时间。
具体来说,本书中的问题是从以下几个角度来设计的。
● 尽可能地以贴近生活的案例为主,让读者能感受到解答谜题的乐趣
● 源代码比较简短,用极少的时间就能实现
● 用简单的数字就能处理输入和输出
● 稍加琢磨后就能缩短处理时间,让读者能从中体会到成就感
当然,并不是所有问题都满足上面 4 点。有些问题必须多写几行代码才能解决,而有些问题不费功夫就能得出答案。
但总体来看,不断求解这些问题也许能让各位读者受到启发,为大家学习编程排忧解难。就像小学生在学习算术时反复做练习题一样,我希望读者也可以通过反复解决问题来掌握编程语言的特征和编程技巧。
致谢
在为 IT 工程师提供业务技能评估服务的网络平台 CodeIQ 上有一个名为“本周算法”的栏目。我在这个栏目中担任出题人,本书中的问题皆出自这个栏目。当然,这里对原问题稍微进行了修改和补充。感谢每周在我出题后负责检查题目的山本有悟先生,以及 CodeIQ 的其他工作人员。
另外,还要感谢积极参与“本周算法”挑战的各位答题者。正是因为有你们,我才能一直坚持出题。真的非常感谢大家!
本书概要
本书为 70 道数学谜题编写了解题程序。每个问题大致分为“问题页”和“讲解页”两部分。“问题页”从单页起,请读者先通读问题描述,再动手编写程序尝试解题。在这个过程中,具体的实现方法是其次的,最重要的是思考“通过哪些步骤来实现才能够解决问题”。
翻过问题页就能看到思路讲解和源代码示例了。请读者留意自己在编程时对处理速度、可读性等所做的优化,和本书提供的源代码示例之间有什么不同。如果事先看了思路讲解和答案,就会失去解题的乐趣,所以建议各位读者先编程解题,再看讲解页。
问题页
讲解页
出场人物介绍
下载相关
本书讲解页上记载的源代码可以通过以下网址下载。
下载文件的著作权归作者及出版社(翔泳社、人民邮电出版社)所有。未经允许,不能通过网络传播和转载。
此外,源代码已在以下执行环境中验证。
● Ruby 2.5.0
● JavaScript(ECMAScript 2016)