《具體數學》是高德納經典著做《計算機程序藝術》的數學預備知識部分的深化和拓展。html
咱們先看一道題,ide
一個娛樂場裏面,有一個輪盤賭局,輪盤上有編號爲1到1000的1000個槽。若是一次旋轉小球落在的槽裏的數字$n$知足$\lfloor\sqrt[3]{n}\rfloor|n$,則娛樂場付給咱們5元,不然咱們損失一元。若是咱們玩這個遊戲,會不會有但願贏錢。函數
其中$\lfloor\sqrt[3]{n}\rfloor|n$表示$\sqrt[3]{n}$的下取整能整除$n$,即$n$能夠表示成$\lfloor\sqrt[3]{n}\rfloor|n$的整數倍。this
通常此類有關輸贏的問題,都是要回答兩個問題:idea
用這樣的思路思考這道題,就是要計算贏錢的機率和指望。假設1000個數出現的概率相等,那麼獲勝的機率就是1000個數裏知足條件$\lfloor\sqrt[3]{n}\rfloor|n$的個數$W$除以1000,能夠獲得計算指望的公式以下設計
$$\frac{5W-(1000-W)}{1000}$$ 如今問題轉化成求解從1到1000能知足$\lfloor\sqrt[3]{n}\rfloor|n$的數字有多少個?htm
咱們怎麼計算呢?blog
若是n是個小的數,咱們能夠經過枚舉很快的計算獲得。但1000不算小。這個問題包含了這本書的幾個知識點,答案$W=172$,具體解答放在下一篇文章裏。遞歸
本書一共有九章內容,分別爲:遊戲
"Kenneth E.Iverson introduced a wonderful idea in his programming language APL, and we'll see that it greatly simplifies many of the things we want to do in this book. The idea is simply to enclose a true-or-false statement in brackets, and to say that the result is 1 if the statement is true, 0 if the statement is false. "
上面的意思就是用[statement]來表示1和0,舉個例子以下,
$$[P是素數]=
\begin{cases}
0& \text{p is not prime}\\
1& \text{P is prime}
\end{cases}$$
Iverson 標記能夠在把\(\sum\)的上下標中的條件給去掉,表示成更容易理解的形式(對Iversion標記熟悉後很方便)求和\(\sum\)均可以寫成以下的形式
\(\sum_k{a_k}[P(k)]\)
若是P(k)爲假則\(a_k[P(k)]\)這一項爲0,因此,以上的求和把全部知足條件的項都包含進去了。使用這樣的標記方法,可讓咱們更簡單方便的操縱求和的上下標。
例如,全部的偶數求和常規的表示形式是$\sum_{k}{2k},使用Iverson記法能夠表示成 $$\sum_{j=1}{k[k=2j]}$$
在某些時候通過這樣變換的指標讓咱們更加清晰的看清關係,書上的一個變換例子以下
原文首發於博客園 Hall Of FAME