编程的乐趣 用python解算法谜题_编程的乐趣:用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的官方网站上有极佳的学习资源,edX/MITx 6.0001x课程也有对Python编程的很好介绍。

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

在每个谜题的结尾都会有几道编程的习题。这些习题的难度与所需编写的代码量各有不同。做完每个谜题的习题,将有助于充分掌握本书的内容。读者必须对谜题相关的代码有足够的理解,然后才有能力对其做出修改或改进其功能。书中的一部分习题包含了对错误输入的检查。标为“难题”的习题需要相当大的代码量,或要对已给出的谜题代码进行重构。其中的一部分难题可视为已介绍谜题的高级版本。本书没有提供习题和谜题的答案,教学人员可到MIT出版社网站的本书页面去获取。

文章转自异步社区

原文链接 https://www.epubit.com/articleDetails?id=Ncca05e37-1ae8-4b48-b88e-e4cc0b2ef195

你可能感兴趣的:(编程的乐趣,用python解算法谜题)