具体描述
这是一本介绍通过解决复杂谜题来学习编程的书,书中的代码用Python语言编写。与以往的编程书不同,本书将对代码功能的理解与编程语言语法和语义的理解分离开来,从解每个谜题开始,先给出解谜题的算法,随后用Python语法和语义实现对应的算法,并适当做出解释。本书包含了21个谜题,其中很多谜题都广为流传,如多皇后、汉诺塔、在几秒钟内解决数独问题、验证六度分隔猜想等,每个谜题后面都配有不同难度的编程习题,帮读者加深对相关算法的理解。
本书在算法谜题的趣味性和计算机编程的实用性之间搭建了一座桥梁,内容饶有趣味,讲述易于理解,适合已掌握初级编程概念并对算法感兴趣的学习者阅读和参考。
作者简介
斯里尼·德瓦达斯(Srini Devadas) 麻省理工学院(MIT)计算机科学和人工智能实验室(CSAIL)电子工程和计算机科学教授,自1988年起在麻省理工学院任教。他目前的研究兴趣主要集中在计算机体系结构、计算机安全和应用密码学领域。他因其研究成就获得了2014年IEEE计算机学会技术成就奖、2015年ACM/IEEE理查德·牛顿技术影响力奖和2017年IEEE华莱士·麦克道尔奖。他在MIT教授编程基础、算法导论和算法设计与分析等课程。
译者简介
戴旭:高级项目管理师,从事金融信息化和电子政务工作多年,现为杭州城市大脑研发团队成员,译有《Python快速入门》《Android平板电脑开发秘籍》《编写高性能的.NET代码》等。
李亚舟:现任职于知乎,负责数据库平台,关注存储、分布式系统、容器等技术,译有《Haskell趣学指南》。
许亚运:曾任职于高德、饿了么,有多年互联网行业后端开发经验,爱好Python,喜欢探索新技术。
目录信息
1.1 寻找想法相同的连续人员 2
1.2 字符串、列表和元组 3
1.3 从算法到代码 4
1.4 代码优化 7
1.5 列表创建与修改 7
1.6 作用域 8
1.7 算法优化 9
1.8 单遍算法 9
1.9 应用 10
1.10 习题 11
谜题2 参加派对的最佳时间 13
2.1 反复检查时间 14
2.2 聪明地检查时间 16
2.3 有序的表示 20
2.4 习题 20
谜题3 拥有(需要一点校准的)读心术 22
3.1 编程完成助手的工作 24
3.2 编程完成魔术师的任务 28
3.3 独自掌握技巧 29
3.4 信息编码 31
3.5 4张牌的魔术戏法 31
3.6 习题 32
谜题4 让皇后保持分离 34
4.1 系统地搜索 36
4.2 用二维列表(数组)表示棋盘 38
4.3 用一维列表(数组)表示棋盘 41
4.4 迭代枚举 45
4.5 习题 46
谜题5 请打碎水晶 47
5.1 两颗球的高效搜索 48
5.2 d颗球的高效搜索 49
5.3 对两颗球减少抛球次数 53
5.4 习题 54
谜题6 寻找假币 55
6.1 分治 55
6.2 递归分治 57
6.3 三进制表示 60
6.4 称量谜题一个流行的变体 61
6.5 习题 61
谜题7 跳到平方根 62
7.1 迭代查找 62
7.2 折半查找 65
7.3 二分搜索 67
7.4 三分搜索 69
7.5 习题 69
谜题8 猜猜谁不来吃晚餐 71
8.1 第 一次尝试 72
8.2 始终寻找最大选择 73
8.3 生成所有组合 74
8.4 移除不友好的组合 76
8.5 选择最大组合 76
8.6 优化内存使用 77
8.7 应用 78
8.8 习题 79
谜题9 美国达人秀 81
9.1 每次生成并测试一个组合 83
9.2 确定缺少一门绝活的组合 84
9.3 应用 85
9.4 习题 86
谜题10 多皇后 88
10.1 递归求取最大公约数 88
10.2 递归获取斐波那契数列 89
10.3 递归求解N皇后问题 91
10.4 递归的应用 94
10.5 习题 96
谜题11 请满铺庭院 98
11.1 归并排序 99
11.2 归并排序的执行与分析 101
11.3 基线条件即2 × 2庭院 102
11.4 递归步骤 103
11.5 列表推导式的基础知识 107
11.6 美观打印 107
11.7 另一个满铺谜题 109
11.8 习题 109
谜题12 汉诺塔 111
12.1 汉诺塔的递归解决方案 112
12.2 相邻汉诺塔的递归解决方案 114
12.3 与格雷码的关系 117
12.4 习题 118
谜题13 没条理的工匠 121
13.1 分治时的围绕基准点分拣 122
13.2 与排序算法的关系 123
13.3 原地划分 126
13.4 排序也疯狂 129
13.5 习题 129
谜题14 再也不玩数独了 131
14.1 递归式数独求解 132
14.2 递归搜索过程中的推理 136
14.3 数独谜题的难度 140
14.4 习题 141
谜题15 统计零钱的组合方式 143
15.1 钞票的递归选取 143
15.2 消除重复 145
15.3 用最少的钞票支付 147
15.4 习题 148
谜题16 贪心是好事 150
16.1 贪心算法 151
16.2 最短历时规则 151
16.3 最早开始时间规则 151
16.4 最少冲突规则 152
16.5 最早结束时间规则 152
16.6 贪心算法何时有效 157
16.7 习题 158
谜题17 字母也疯狂 160
17.1 每次找到一组变位词 160
17.2 通过排序对变位词进行分组 162
17.3 通过散列操作对变位词进行分组 164
17.4 字典 165
17.5 用字典对变位词进行分组 167
17.6 散列表 169
17.7 习题 171
谜题18 充分利用记忆 173
18.1 递归解决方案 173
18.2 回溯硬币的选择过程 175
18.3 memoization技术 178
18.4 避免使用异常 179
18.5 动态规划 180
18.6 习题 180
谜题19 要记得周末 184
19.1 找到分区 185
19.2 二分图的判别 187
19.3 图的表示 189
19.4 图的着色 192
19.5 习题 193
谜题20 六度分隔 195
20.1 广度优先搜索 197
20.2 集合 198
20.3 在广度优先搜索中使用集合 199
20.4 历史 202
20.5 习题 203
谜题21 问题有价 205
21.1 用字典构造二叉查找树 207
21.2 字典形式下的二叉查找树操作 209
21.3 面向对象风格的二叉查找树 212
21.4 回到谜题:算法 216
21.5 解决谜题的代码 218
21.6 多种数据结构的对比 222
21.7 习题 222
· · · · · · (收起)
读后感
用户评价
我是一个非常注重效率和解决问题能力的人,并且深知在当今这个数字化时代,掌握一些基本的编程技能,能够极大地提升我的工作和生活效率。然而,我一直对编程感到有些陌生,觉得它是一个需要很高门槛的领域。《编程的乐趣》这本书的标题,恰恰吸引了我,因为它传递出一种“可学性”和“趣味性”的信息,让我觉得它更加 approachable。我期待在这本书中,我能够找到一些实用的编程技巧,能够帮助我自动化一些重复性的工作,能够更好地管理和分析数据,甚至能够为我提供一些解决实际问题的思路和方法。我希望这本书能够让我认识到编程的实际价值,并且在学习的过程中,能够体验到那种“征服”技术难题的成就感,从而激发我持续学习和探索的动力。
作为一名在传统行业摸爬滚打多年的从业者,我常常觉得自己的工作虽然稳定,却缺乏一些创新和突破的火花。最近,我开始关注到编程在各个领域渗透的力量,从数据分析到自动化办公,再到更前沿的人工智能,都让我意识到掌握一定的编程技能,可能会为我的职业生涯带来意想不到的转机。而《编程的乐趣》这本书,恰恰给了我这样一个绝佳的机会。我之所以被它吸引,是因为它没有将编程描绘成一个只有高智商人才才能涉足的领域,而是强调了“乐趣”二字,这让我觉得它更加接地气,也更容易让我这个“门外汉”去尝试。我期待这本书能够教会我如何用代码来解决工作中遇到的实际问题,例如如何自动化一些重复性的任务,如何更高效地处理和分析数据,甚至是如何构建一些小型的工具来提升工作效率。我希望通过阅读这本书,我能发现编程的实用价值,并在这个过程中,找到一种新的、充满创造性的工作方式。
我是一个非常喜欢思考和钻研的人,尤其对那些能够揭示事物本质的规律和方法感到着迷。编程,在我看来,就是一种将逻辑和创造力完美结合的艺术。然而,市面上很多编程书籍往往过于侧重技术细节,而忽略了编程背后的思维方式和哲学。《编程的乐趣》这本书的标题,让我眼前一亮。它暗示着,编程不仅仅是写代码,更是一种享受过程、体验创造的过程。我期待在这本书中,我能够找到对编程更深层次的理解,不仅仅是掌握某一种语言的语法,更重要的是学会如何用编程的思维去分析问题、设计解决方案。我希望它能教会我如何将抽象的概念具象化,如何一步步地构建一个功能完善的程序,并在整个过程中,体验到那种“抽丝剥茧”的乐趣,以及最终看到自己创造的成果时所带来的巨大满足感。
我是一名对技术世界充满好奇的爱好者,虽然我并非科班出身,但对于那些能改变我们生活方式的数字魔法总是心向往之。当我偶然看到《编程的乐趣》这本书时,我的第一反应就是它或许能为我打开一扇新的大门。我一直对那些能够将抽象概念转化为具体应用的编程语言感到着迷,比如那些能够构建网站、制作游戏,甚至能够驱动人工智能的语言。这本书的名字直接触及了我内心深处对“创造”的渴望,那种将一个想法从无到有变为现实的成就感,我相信是编程最迷人的部分之一。我期待在这本书中找到的,不只是枯燥的语法和指令,更是一种思维方式的启迪,一种解决问题的方法论,一种能够让我用更有效、更有趣的方式去理解和改造这个数字时代的方式。我设想,这本书会用生动有趣的例子,将复杂的编程概念剥茧抽丝,让我这个初学者也能轻松理解,并且能够快速上手,体验到那种“我做到了!”的喜悦。
我是一个喜欢尝试新鲜事物,并且乐于不断学习和进步的人。最近,我发现周围很多朋友都在学习编程,并且从中获得了不少乐趣和成就感。这让我对编程产生了浓厚的兴趣,但又觉得从何处着手是一个问题。《编程的乐趣》这本书的标题,正是我所需要的。它让我觉得,编程并不是一件枯燥乏味的事情,而是可以充满趣味的。我期待这本书能够以一种非常友好的方式,带领我进入编程的奇妙世界。我希望它能够从最基础的概念讲起,用简单易懂的语言和生动有趣的例子,让我理解编程的逻辑和核心思想。我希望通过阅读这本书,我能够快速上手,并且能够亲手制作一些有趣的小程序,体验到那种“让想法变成现实”的乐趣,并且在学习的过程中,感受到持续进步的喜悦。
我对事物的好奇心总是很强,尤其对那些能够改变世界、影响人们生活方式的科技充满兴趣。编程,无疑是当今时代最具代表性的技术之一。然而,我一直认为编程是一项非常专业且需要天赋的技能,对于我这样的普通人来说,可能很难入门。《编程的乐趣》这本书的标题,恰恰挑战了我的这种固有观念。它传递出一种开放和包容的信息,让我觉得编程并非遥不可及,而是可以从中找到乐趣的。我期待这本书能够以一种非常友好的方式,引导我进入编程的世界。我希望它能从最基础的概念讲起,用生动形象的比喻和贴近生活的例子,让我理解编程的逻辑和思维方式。我更希望通过这本书,我能体验到将一个想法转化为现实的喜悦,能够感受到代码带来的创造力和可能性,从而激发我进一步学习和探索的兴趣,最终能够用编程来解决一些我生活中遇到的有趣的问题。
我是一位喜欢挑战和探索的大学生,虽然我的专业与计算机科学并非直接相关,但我一直对技术革新充满热情,并且渴望学习一些能够拓展我视野和能力的技能。市面上关于编程的书籍琳琅满目,但很多都过于学术化,或者专注于某一门特定的语言,让我这个想要全面了解编程本质的人感到有些无从下手。《编程的乐趣》这个名字,在我看来,恰恰击中了我的痛点。它传递的信息是,编程不仅是一门技术,更是一种思维方式,一种解决问题的工具,而且最重要的是,它应该是一个令人愉悦的过程。我希望这本书能够帮助我理解编程的核心逻辑,掌握一些通用的编程思想,并且通过一些生动有趣的案例,让我领略到编程的魅力所在。我期待它能教会我如何将我的想法转化为实际的程序,如何去构建一个能够解决实际问题的项目,并在学习的过程中,感受到那种“从零开始创造”的成就感。
作为一个已经步入社会一段时间的职场人士,我时常感到自己固步自封,渴望学习一些新的东西来为自己的生活和职业注入新的活力。最近,我被身边许多朋友都在谈论的编程技术所吸引,但又觉得那些教程要么太枯燥,要么太专业,让我望而却步。《编程的乐趣》这本书的出现,如同一股清流,让我看到了希望。我之所以会被它吸引,是因为它强调了“乐趣”——这对我来说至关重要。我希望通过阅读这本书,我能够以一种轻松愉快的方式接触编程,而不是被复杂的理论和难懂的代码压垮。我期待它能教会我一些实用的编程技能,能够帮助我解决生活中遇到的实际问题,例如如何处理表格数据,如何自动化一些日常的琐事,甚至是如何制作一个简单的网页来展示自己的兴趣。我希望这本书能让我明白,编程并非高不可攀,而是人人都可以尝试的,并且能够在其中找到属于自己的那份乐趣和成就感。
这本书的封面上,“编程的乐趣”这几个字就散发着一种独特的魅力,让我一拿到手里就迫不及待地想翻开。我一直觉得编程是一件很神秘、很高端的事情,只有那些天才或者经过多年苦练的人才能掌握。但这本书的标题却大胆地向我传递了一个信息:编程,是可以充满乐趣的。这让我这个之前对编程充满敬畏甚至有些畏惧的普通人,瞬间感到了一丝亲近和好奇。它不像那些充斥着晦涩术语和复杂算法的书籍,它的语言似乎更加平易近人,仿佛一位经验丰富的老师,准备带着我一起去探索这个充满无限可能的世界。我猜想,这本书不会仅仅停留在技术层面,它更可能是在挖掘编程背后的思想和创造力,让我看到代码如何化为生动的应用,如何解决现实问题,如何实现一个想法。我期待着在这本书中找到属于自己的编程乐趣,哪怕是最基础的入门,我也相信它能让我感受到那种“让机器听从自己指挥”的奇妙成就感。
我是一名对艺术和设计充满热情的人,虽然我的专业领域可能与技术沾不上边,但我一直相信,技术和艺术是可以完美融合的。最近,我开始对那些能够将创意变为现实的数字工具感到好奇,而编程,无疑是其中最强大的力量之一。《编程的乐趣》这本书的标题,对我来说,就像是打开了一扇通往全新世界的大门。它让我意识到,编程并非只是冷冰冰的代码,更是一种充满创造力的表达方式。我期待这本书能够用一种富有艺术感的方式,引导我走进编程的世界。我希望它能用生动有趣的案例,展示编程如何在艺术、设计、音乐等领域发挥作用,并且能够教会我一些基础的编程知识,让我能够尝试将自己的创意转化为数字作品。我希望通过这本书,我能够感受到编程的魅力,并发现技术与艺术结合的可能性,为我的创作带来新的灵感和工具。