産品特色
編輯推薦
如果數學不好,是否可以成為一名程序員呢?答案是肯定的。 《程序員的數學》適閤:數學糟糕但又想學習編程的你
沒有晦澀的公式,隻有好玩的數學題。
幫你掌握編程所需的“數學思維”。
日文版已重印14次!
內容簡介
《圖靈程序設計叢書:程序員的數學》麵嚮程序員介紹瞭編程中常用的數學知識,藉以培養初級程序員的數學思維。讀者無需精通編程,也無需精通數學,隻需具備四則運算和乘方等基礎知識,就可以閱讀《程序員的數學》。 書中講解瞭二進製計數法、邏輯、餘數、排列組閤、遞歸、指數爆炸、不可解問題等許多與編程密切相關的數學方法,分析瞭哥尼斯堡七橋問題、高斯求和方法、漢諾塔、斐波那契數列等經典問題和算法。引導讀者深入理解編程中的數學方法和思路。 《程序員的數學》適閤程序設計人員以及編程和數學愛好者閱讀。
作者簡介
結城浩(Hiroshi Yuki),生於1963年,日本專業技術作傢和程序員。在編程語言、設計模式、數學、加密技術等領域,編寫瞭很多深受歡迎的入門書。代錶作有《數學女孩》係列、《程序員的數學》等。
管傑,畢業於復旦大學日語係。現為對日軟件工程師,多年日語技術文檔編寫經驗。愛好日漢翻譯和日本文化史,譯有《明解C語言:入門篇》等。
內頁插圖
目錄
第1章 0的故事——無即是有
本章學習內容
小學一年級的迴憶
10進製計數法
什麼是10進製計數法
分解2503
2進製計數法
什麼是2進製計數法
分解1100
基數轉換
計算機中為什麼采用2進製計數法
按位計數法
什麼是按位計數法
不使用按位計數法的羅馬數字
指數法則
10的0次方是什麼
10-1是什麼
規則的擴展
對20進行思考
2-1是什麼
0所起的作用
0的作用:占位
0的作用:統一標準,簡化規則
日常生活中的0
人類的極限和構造的發現
重溫曆史進程
為瞭超越人類的極限
本章小結
第2章 邏輯——真與假的二元世界
本章學習內容
為何邏輯如此重要
邏輯是消除歧義的工具
緻對邏輯持否定意見的讀者
乘車費用問題——兼顧完整性和排他性
車費規則
命題及其真假
有沒有“遺漏”
有沒有“重復”
畫一根數軸輔助思考
注意邊界值
兼顧完整性和排他性
使用if語句分解問題
邏輯的基本是兩個分支
建立復雜命題
邏輯非——不是A
邏輯與——A並且B
邏輯或——A或者B
異或——A或者B(但不都滿足)
相等——A和B等
蘊涵——若A則B
囊括所有瞭嗎
德·摩根定律
德·摩根定律是什麼
對偶性
卡諾圖
二燈遊戲
首先藉助邏輯錶達式進行思考
學習使用卡諾圖
三燈遊戲
包含未定義的邏輯
帶條件的邏輯與(&&)
帶條件的邏輯或(||)
三值邏輯中的否定(!)
三值邏輯的德?摩根定律
囊括所有瞭嗎
本章小結
第3章 餘數——周期性和分組
本章學習內容
星期數的思考題(1)
思考題(100天以後是星期幾)
思考題答案
運用餘數思考
餘數的力量——將較大的數字除一次就能分組
星期數的思考題(2)
思考題(10100天以後是星期幾)
提示:可以直接計算嗎
思考題答案
發現規律
直觀地把握規律
乘方的思考題
思考題(1234567987654321)
提示:通過試算找齣規律
思考題答案
迴顧:規律和餘數的關係
通過黑白棋通信
思考題
提示
思考題答案
奇偶校驗
奇偶校驗位將數字分為兩個集閤
尋找戀人的思考題
思考題(尋找戀人)
提示:先試算較小的數
思考題答案
迴顧
鋪設草席的思考題
思考題(在房間裏鋪設草席)
提示:先計算一下草席數
思考題答案
迴顧
一筆畫的思考題
思考題(哥尼斯堡七橋問題)
提示:試算一下
提示:考慮簡化一下
提示:考慮入口和齣口
思考題答案
奇偶校驗
本章小結
第4章 數學歸納法——如何徵服無窮數列
本章學習內容
高斯求和
思考題(存錢罐裏的錢)
思考一下
小高斯的解答
討論一下小高斯的解答
歸納
數學歸納法——如何徵服無窮數列
0以上的整數的斷言
高斯的斷言
什麼是數學歸納法
試著徵服無窮數列
用數學歸納法證明高斯的斷言
求齣奇數的和——數學歸納法實例
奇數的和
通過數學歸納法證明
圖形化說明
黑白棋思考題——錯誤的數學歸納法
思考題(黑白棋子的顔色)
提示:不要為圖所惑
思考題答案
編程和數學歸納法
通過循環錶示數學歸納法
循環不變式
本章小結
第5章 排列組閤——解決計數問題的方法
本章學習內容
計數——與整數的對應關係
何謂計數
注意“遺漏”和“重復”
植樹問題——不要忘記0
植樹問題思考題
加法法則
加法法則
乘法法則
乘法法則
置換
置換
歸納一下
思考題(撲剋牌的擺法)
排列
排列
歸納一下
樹形圖——能夠認清本質嗎
組閤
組閤
歸納一下
置換、排列、組閤的關係
思考題練習
重復組閤
也要善於運用邏輯
本章小結
第6章 遞歸——自己定義自己
本章學習內容
漢諾塔
思考題(漢諾塔)
提示:先從小漢諾塔著手
思考題答案
求齣解析式
解齣漢諾塔的程序
找齣遞歸結構
再談階乘
階乘的遞歸定義
思考題(和的定義)
遞歸和歸納
斐波那契數列
思考題(不斷繁殖的動物)
斐波那契數列
帕斯卡三角形
什麼是帕斯卡三角形
遞歸定義組閤數
組閤的數學理論解釋
遞歸圖形
以遞歸形式畫樹
實際作圖
謝爾平斯基三角形
本章小結
第7章 指數爆炸——如何解決復雜問題
本章學習內容
什麼是指數爆炸
思考題(摺紙問題)
指數爆炸
倍數遊戲——指數爆炸引發的難題
程序的設置選項
不能認為是“有限的”就不假思索
二分法查找——利用指數爆炸進行查找
尋找犯人的思考題
提示:先思考人數較少的情況
思考題答案
找齣遞歸結構以及遞推公式
二分法查找和指數爆炸
對數——掌握指數爆炸的工具
什麼是對數
對數和乘方的關係
以2為底的對數
以2為底的對數練習
對數圖錶
指數法則和對數
對數和計算尺
密碼——利用指數爆炸加密
暴力破解法
字長和安全性的關係
如何處理指數爆炸
理解問題空間的大小
四種處理方法
本章小結
第8章 不可解問題——不可解的數、無法編寫的程序
本章學習內容
反證法
什麼是反證法
質數思考題
反證法的注意事項
可數
什麼是可數
可數集閤的例子
有沒有不可數的集閤
對角論證法
所有整數數列的集閤是不可數的
所有實數的集閤是不可數的
所有函數的集閤也是不可數的
不可解問題
什麼是不可解問題
存在不可解問題
思考題
停機問題
停機
處理程序的程序
什麼是停機問題
停機問題的證明
寫給尚未理解的讀者
不可解問題有很多
本章小結
第9章 什麼是程序員的數學——總結篇
本章學習內容
何為解決問題
認清模式,進行抽象化
由不擅長催生齣的智慧
幻想法則
程序員的數學
……
精彩書摘
◎課前對話
老師:假設現在有一排多米諾骨牌。如何將它們全部推倒呢?
學生:這個簡單!隻要將它們排列成其中1 個一倒就能順次帶倒下一個的形狀就行瞭。
老師:這樣還不夠喔!
學生:啊?為什麼呢?
老師:因為還需要推倒第一個多米諾骨牌。
學生:那不是理所當然的嘛!
老師:正是!這樣你就能理解數學歸納法的兩個步驟瞭。
本章學習內容
本章我們要學習的是數學歸納法。數學歸納法是證明某斷言對於0 以上的所有整數(0,1,2,3…)都成立的方法。整數0,1,2,3…有無窮個,但若使用數學歸納法,隻需經過"2個步驟",就能證明有關無窮的命題。
首先,我們以求齣1 到100 之和為例介紹數學歸納法。接著會穿插幾道思考題來看一下數學歸納法的具體實例。最後,我們會討論數學歸納法和編程的關係,一起瞭解一下循環不變式。
高斯求和
思考題(存錢罐裏的錢)
思考題(存錢罐裏的錢)
在你麵前有一個空存錢罐。
第1 天,往存錢罐裏投入1 元。存錢罐中總金額為1 元。
第2 天,往存錢罐裏投入2 元。存錢罐中總金額為1 + 2 = 3 元
第3 天,往存錢罐裏投入3 元。存錢罐中總金額為1 + 2 + 3 = 6 元
第4 天,往存錢罐裏投入4 元。存錢罐中總金額為1 + 2 + 3 + 4 = 10 元
那麼,每天都這樣往存錢罐裏投入硬幣的話,第100 天時的總金額為多少呢?
思考一下
本題要求算齣第100 天時存錢罐的總金額。要求齣第100 天的金額,隻要計算1 + 2 + 3+ … + 100 的值就行瞭。那麼,具體應如何計算呢?
一般來說,最先想到的肯定是機械地將它們逐個相加。1 加2,再加3,再加4,…再加99,再加100。隻要這樣加起來就能得齣答案瞭吧。如果說筆算比較花時間的話,也可以使用計算器或編程來計算。
不過,德國數學傢高斯在9 歲時遇到瞭同樣的問題,卻馬上得齣瞭答案。當時他既沒用計算器也沒用電腦。那麼,他究竟是如何做到的呢?
小高斯的解答
小高斯是這麼考慮的。
1 + 2 + 3 + …+ 100 順次計算的結果和100 + 99 + 98 + …+ 1 逆嚮計算的結果應該是相等的。那麼,就將這兩串數字像下麵那樣縱嚮地相加。
如此一來,就變成瞭101 + 101 + 101 + …+ 101 那樣100 個101 相加的結果。這樣的計算就非常簡單瞭。隻要將101 乘以100 即可,結果為10100。不過10100 是要求的數的2 倍,因此還得除以2,答案為5050。
答案:5050 元。
討論一下小高斯的解答
小高斯的方法可謂絕妙非凡!
為瞭便於大傢理解,我們將高斯的方法用圖來錶示。求1 + 2 + 3 + …+ 100 的結果,相當於計算圖4-1 所示的排列成階梯型的瓷磚塊數。
圖4-1 將高斯的方法圖形化
高斯則又做瞭一個一模一樣的階梯,並將兩者閤二為一,組成瞭一個長方形。
圖4-2 將2個階梯組閤成1個長方形
由2 個階梯組閤而成的長方形,縱嚮有101 塊瓷磚,橫嚮有100 塊瓷磚。因此,該長方形由101×100 = 10100 塊瓷磚構成。而所求的瓷磚塊數就是10100 的一半,即5050。
我們來說一說高斯的計算效率。使用他的方法不需要花費力氣逐個相加。隻要將兩端的1 和100 相加,結果乘以100 再除以2 就行瞭。
現在,假設我們不是從1 加到100,而是從1 加到10000000000(100 億)。這次我們就不能采用逐一相加的方法瞭。因為即使計算器1 秒能完成1 次加法計算,加到100 億也得花300 年以上的時間。
不過,如果使用高斯的方法,那麼從1 加到100 億也隻要1 次加法、1 次乘法、1 次除法運算即可完事。我們來實際計算一下。
高斯(Karl Friedrich Gauss, 1777 - 1855)後來成為瞭曆史上著名的數學傢。
歸納
高斯運用瞭以下等式。
這裏,使用變量n,將"1 到100"歸納為"1 到n"。這樣,上麵的等式就變為如下形式
那麼,這個等式對於0 以上的任意整數n 都成立嗎?即n 為100、200,或者100 萬、100 億時該等式也都成立嗎?如果成立的話,又如何來證明呢?
這種時候就要用到數學歸納法瞭。數學歸納法是證明"斷言對於0 以上的所有整數n都成立"的方法。
學生:"對於所有整數n",總覺得這種說法彆扭。
老師:彆扭?
學生:會感覺頭腦中充滿瞭整數。
老師:那麼,改為"對於任一整數n"怎麼樣?
學生:啊!那樣感覺稍微舒服些。
老師:其實說的是一迴事呢!
數學歸納法-- 如何徵服無窮數列
本節,我們就來討論一下數學歸納法的相關內容。首先,從"0 以上的整數的斷言"開始學起,然後使用數學歸納法來證明高斯的斷言 。
0以上的整數的斷言
0 以上的整數n 的斷言",就是能夠判定0,1,2…等各個整數為"真"或"假"的斷言。這樣說明或許難以理解,下麵就舉幾個例子。.
● 例1
o 斷言A (n ) :n ×2 為偶數。
A(n),即"n×2 為偶數"的斷言。由於n 為0 時,0×2 = 0 為偶數,所以A(0) 為真。
A(1) 又怎麼樣呢?因為1×2 = 2 為偶數,所以A(1) 也為真。
那是否可以說斷言A(n),對於0 以上的所有整數n 都為真(對於0 以上的任意整數n都成立)呢?
對!可以這麼說。因為0 以上的任意整數乘以2 的結果都為偶數,所以對於0 以上的所有整數,斷言A(n) 都為真。
● 例2
o 斷言B (n ) :n ×3 為奇數
那麼,斷言B(n) 又將如何呢?該斷言對於0 以上的所有整數n 都成立嗎?
例如,假設n 為1,則斷言B(1) 就是"1×3 為奇數",這個結果為真。但不能說對於0以上的所有整數n,斷言B(n) 都為真。因為假設n 為2,則n×3 的值為2×3 = 6。而6 是偶數,所以斷言B(2) 不為真(為假)。
n = 2 是推翻"斷言B(n) 對於0 以上的所有整數n 都成立"的反例。
● 其他例子
那麼請思考一下,在下麵4 個斷言中,對於0 以上的所有整數n 都成立的有哪些。
o 斷言C (n ) :n +1 為 0 以上的整數。
o 斷言D (n ) :n -1 為 0 以上的整數。
o 斷言E (n ) :n ×2 為 0 以上的整數。
o 斷言F (n ) :n ÷2 為 0 以上的整數。
斷言C(n),對於0 以上的所有整數n 都成立。因為若n 為0 以上的整數,則n + 1 肯定是0 以上的整數。
斷言D(n),對於0 以上的所有整數n 不成立。例如,斷言D(0) 為假。因為0 -1 = -1,不是0 以上的整數。n = 0 是唯一的反例。
斷言E(n),對於0 以上的所有整數n 都成立。
斷言F(n),對於0 以上的所有整數n 不成立。因為當n 為奇數時,n÷2 的結果不是整數。
高斯的斷言
在討論瞭" 0 以上的整數n 的斷言"之後, 我們將話題轉迴高斯的斷言。
可以使用下述有關n 的斷言形式來錶現高斯的觀點。
o 斷言G(n) :0 到n 的整數之和為 。
接下來要證明的是,"G(n) 對於0 以上的所有整數n 都成立"。可以通過描畫前麵的階梯狀的圖(圖4-1)來證明,但是有人可能會有這樣的疑問:0 以上的整數有0, 1, 2, 3,…等無窮個數字,而圖中錶現的隻是其中一種情況。 當G(1000000) 時也成立嗎?
確實,0 以上的整數有無窮個。這就要通過引入"數學歸納法"來證明瞭。使用數學歸納法能夠進行0 以上的所有整數的相關證明。
什麼是數學歸納法
數學歸納法是證明有關整數的斷言對於0 以上的所有整數(0、1、2、3…)是否成立時所用的方法。
假設現在要用數學歸納法來證明"斷言P(n)對於0 以上的所有整數n 都成立"。
數學歸納法要經過以下兩個步驟進行證明。這是本章的核心內容,請大傢仔細閱讀。
o 步驟1 :
證明"P (0) 成立"。
o 步驟2 :
證明不論k 為0 以上的哪個整數,"若P (k ) 成立,則P (k +1) 也成立"
在步驟1 中,要證明當k 為0 時斷言P(0) 成立。我們將步驟1 稱作基底(base)。
在步驟2 中,要證明無論k 為0 以上的哪個整數,"若P( k ) 成立,則P (k+1) 也成立"。
我們將步驟2 稱作歸納(induction)。該步驟證明斷言若對於0 以上的某個整數成立,則對於下一個整數也成立。
若步驟1 和步驟2 都能得到證明,就證明瞭"斷言P (n) 對於0 以上的所有整數n 都成立"。
以上就是數學歸納法的證明方法。
試著徵服無窮數列
數學歸納法通過步驟1(基底)和步驟2(歸納)兩個步驟,證明斷言P(n) 對於0 以上的所有整數n 都成立。
為什麼隻通過兩個步驟的證明,就能證明無窮的n 呢?請作如下思考。
o 斷言P (0) 成立。
理由:步驟1 中已經證明。
o 斷言P (1) 成立。
理由:P (0) 已經成立,並且步驟2 中已證明若P (0) 成立,則P (1) 也成立。
o 斷言P (2) 成立。
理由:P (1) 已經成立,並且步驟2 中已證明若P (1) 成立,則P (2) 也成立。
o 斷言P (3) 成立。
理由:P (2) 已經成立,並且步驟2 中已證明若P (2) 成立,則P (3) 也成立。
這樣循環往復,可以說斷言P(n) 對於任意數字n 都成立。無論n 為多大的數字都沒關係。因為即使設n 為10000000000000000,經過機械式地反復執行步驟2,終究可以證明P(1000000000
程序員的數學 下載 mobi epub pdf txt 電子書 格式