中年|编程的乐趣:用Python解算法的经典趣题你知道几个?


谜题趣味非凡 。 顶级谜题的解可没那么浅显易得 , 需要灵光一闪才能发现 。 算法谜题是指谜题的解法就是算法 , 解题的步骤可以被机器自动执行 。 算法可以用英文或者其他任何自然语言来描述 , 但是为了更加精确 , 往往会用伪代码进行描述 。 之所以称为“伪代码” , 是因为它尚未细化到足以在计算机上运行的程度 , 与用编程语言编写的代码不大一样 。
当今世界有越来越多的人以计算机编程为业 。 为了学习编程 , 我们首先要通过简单的例子学习基本的编程结构 , 例如赋值语句和控制循环之类 , 而编程习题往往涉及将算法的伪代码转译为用所学编程语言编写的代码 。 程序员同样能从求解谜题所需的分析技能中获益 。 无论是将规格说明转换为编程结构 , 还是定位早期代码中的错误(也就是调试过程) , 这些分析技能都不可或缺 。
####下列21个谜题 , 你都解过哪一个?

谜题1 保持一致 1 谜题2参加派对的最佳时间 谜题2参加派对的最佳时间 谜题4让皇后保持分离 谜题5请打碎水晶 谜题6寻找假币 谜题7跳到平方根 谜题8猜猜谁不来吃晚 谜题9美国达人秀 谜题10多皇后 谜题11请满铺庭院 谜题12汉诺塔 谜题13没条理的工匠 谜题14再也不玩数独了 谜题15统计零钱的组合方式 谜题16贪心是好事 谜题17字母也疯狂 谜题18充分利用记忆 谜题19要记得周末 谜题20六度分隔 谜题21问题有价
以上谜题出自《编程的乐趣 用Python解算法谜题》
中年|编程的乐趣:用Python解算法的经典趣题你知道几个?
本文插图
【中年|编程的乐趣:用Python解算法的经典趣题你知道几个?】

本书中每个谜题的开始都会介绍一道谜题 , 其中不少谜题都脍炙人口 , 以各种变体形式在一些出版物和网站上出现过 。 在经历一两次失败的解谜尝试之后 , 突然灵光一闪 , 一种搜索策略、一个数据结构、一个数学公式跃然而出 , 答案就这么自行现身了 。 有时候会对谜题给出明显“暴力”的解法 , 本书会先解释相关的算法与代码 , 再将其解释为“失败” , 然后再“捧出真经” , 引出更加优雅和高效的解法 。

谜题的解法正是需要编写的代码的规格说明书 。 读者要先了解代码要做的事情 , 然后再看代码 。 我坚信这是一种很强大的教学理念 , 因为这把对代码功能的理解与编程语言语法和语义的理解分离开来 。 对于理解代码所需的语法和语义 , 将本着“现学现用”的原则进行介绍 。
由谜题的物理世界到程序的计算机世界虽然很有趣 , 但并不总是一帆风顺 。 在某些情况下 , 必须假定某些操作在计算机世界中效率低下 , 因为其在物理世界中就是如此 。 本书会尽量减少这种情况的出现 , 但是仍无法完全避免 。 相信这不会对学习造成困扰 , 而且在极少出现的几处地方 , 书中都会明确指出 。

读者可以采取多种方式来阅读和使用本书 。 如果仅对谜题本身及其答案感兴趣 , 完全可以在想出自己的解法或阅读本书给出的解法后即刻停止 。 但我不希望读者就此止步 , 因为讲解如何得出解法并转成可执行代码是写作本书的主要目的 。 读完整个谜题将对编写实用的程序所需的要素有很好的感知 , 实用的程序能供任何人自行运行和使用 。 我尽力确保对Python语法和语义的介绍能满足解谜代码的需要 , 但如果读者对Python语法、语义和库等有任何疑问 , 则Python的官方网站上有极佳的学习资源 , edX/MITx 6.0001x课程也有对Python编程的很好介绍 。

如果读者能在自己的计算机上安装和运行Python , 就会从本书收获更多东西 。 这可以通过访问Python的官方网站来实现 。 书中所有谜题解法的代码都可以从MIT出版社网站下载 。 这些代码已在Python 2.7及以上版本(包括3.x版本)中测试过 。 当然 , 欢迎读者忽略这些可下载的代码 , 而编写自己的解题代码 。 强烈建议读者采用与书中示例不同的输入运行一下从网站下载或自行编写的程序 。 尽管我确实已尽力去除程序中的bug , 但仍不能保证代码没有错误 。 注意 , 加入对输入的检查会让代码显得零乱 , 因此 , 书中给出的代码假定输入符合谜题的描述 , 如果收到出乎意料的输入就不一定会有预期的表现了 。 为了加深对编程的理解 , 有一种最好的方式就是不断改进每一个谜题的代码 , 严格地检查格式错误的输入 。


推荐阅读