編程的樂趣 用 Python 解算法謎題 (Programming for the Puzzled: Learn to Program While Solving Puzzles)

[美] 斯里尼·德瓦達斯(Srini Devadas)

立即出貨

買這商品的人也買了...

商品描述

這是一本介紹通過解決復雜謎題來學習編程的書,書中的代碼用Python語言編寫。與以往的編程書不同,本書將對代碼功能的理解與編程語言語法和語義的理解分離開來,從解每個謎題開始,先給出解謎題的算法,隨後用Python語法和語義實現對應的算法,並適當做出解釋。本書包含了21個謎題,其中很多謎題都廣為流傳,如多皇後、漢諾塔、在幾秒鐘內解決數獨問題、驗證六度分隔猜想等,每個謎題後面都配有不同難度的編程習題,幫讀者加深對相關算法的理解。

 

本書在算法謎題的趣味性和電腦編程的實用性之間搭建了一座橋梁,內容饒有趣味,講述易於理解,適合已掌握初級編程概念並對算法感興趣的學習者閱讀和參考。

作者簡介

作者:[美]斯里尼·德瓦達斯(Srini Devadas)譯者:戴旭李亞舟許亞運
作者簡介

斯里尼·德瓦達斯(Srini Devadas)麻省理工學院(MIT)計算機科學和人工智能實驗室(CSAIL)電子工程和計算機科學教授,自1988年起在麻省理工學院任教。他目前的研究興趣主要集中在計算機體系結構、計算機安全和應用密碼學領域。他因其研究成就獲得了2014年IEEE計算機學會技術成就獎、2015年ACM/IEEE理查德·牛頓技術影響力獎和2017年IEEE華萊士·麥克道爾獎。他在MIT教授編程基礎、算法導論和算法設計與分析等課程。

譯者簡介

戴旭高級項目管理師,從事金融信息化和電子政務工作多年,現為杭州城市大腦研發團隊成員,譯有《Python快速入門》《Android平板電腦開發秘籍》《編寫高性能的.NET代碼》等。
李亞舟現任職於知乎,負責數據庫平台,關注存儲、分佈式系統、容器等技術,譯有《Haskell趣學指南》。
許亞運曾任職於高德、餓了麼,有多年互聯網行業後端開發經驗,愛好Python,喜歡探索新技術。
 

目錄大綱

目錄
謎題1保持一致1 
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