《具體數學》1.3遞歸(三)

文章開頭:先吐槽一下長春的天氣,冬天是一星期有6天在下雪,如今算是夏天了吧,動不動下雨下冰雹,天氣變化的有點快,還有就是學校的妹子,分爲女神和女屌絲,女神通常在長春流行穿風衣,女屌絲通常流行穿牛仔系列,最後吐槽一下,我曾經的喜歡過的人變了,唏噓不已,好了吐槽完畢,這一篇介紹一下遞歸的最後一個故事Josephus Circle(約瑟夫環問題),這個部分有點多估計得分兩次了。。。。spa

1.3Josephus Circle(約瑟夫環問題)設計

這本書仍是老規矩,先以故事引出問題:這最後的例子是一個古老問題的變型,它是以公元一世紀著名歷史學家Flavius Josephs命名的。傳說是Josephus的數學才幹讓他逃過一劫。
在猶太人和羅馬人戰爭期間,Josephs等41個猶太反抗者陷入包圍。他們寧死不作俘虜,決定圍成一個圓圈,每次由剩下的人中的第三個自殺,直到全部人都死去爲止。
Josephus和他的1個朋友認爲,自殺是愚蠢的。所以他很快地算出死亡之圈中他倆應該站的位置(固然,是兩個應該最後自殺的位置,沒有人監督他們是否自殺,因此你懂得)
指針

咱們的問題是,從編號爲1到n的圍成一圈的人開始,依次排除剩下的人中的第2個(注意:是從當前「指針」開始),直到僅剩1個倖存者。下面是n = 10的狀況:
遞歸

排除次序是2,4,6,8,10,3,7,1,9。所以5倖存。
問題目標是:如何肯定倖存者的號碼J (n)?
數學

咱們剛纔看到J(10)=5.咱們可能猜想當n是偶數時J(n)=n/2;並且情形n=2支持了猜想:J(2)=1程序設計

但對於n=4,n=6猜想失敗,從上面的表看來,J(n)都是奇數,所以將其做爲新的猜測:事實上第1輪篩選就排除了全部的偶數,所以猜測成立。
另外還觀察到,若n是偶數,那麼在作完第1輪篩選以後,剩下的情形和最初的開始狀況是很是相似的,可是人數要少一半,並且編號也有所不一樣。
假設原先有2n我的,在第1輪篩選以後,剩下的狀況是

效率

此時圓圈剩下了n我的:一、三、五、七、……、2n – 三、2n – 1。並且「指針」又回到了1的位置。這與最初有n我的的情形是相同的,區別僅在於編號有變化。基礎

編號的變化會帶來什麼影響?
從編號1開始,下1個被排除的人是3,其後的篩選過程與n我的的情形一致:
當前的情形:二、四、六、八、……(差爲2的等差數列)
 n我的的情形: 三、七、十一、15(差爲4的等差數列)
相同點:人數相同
不一樣點:編號變爲2倍減1

注意到,倖存者J(2n)必然從當前剩下的人中出現,所以:
J(2n) = 2J(n) – 1
循環

其實,咱們對於人數爲奇數頁能夠獲得J(2n+1)=2J(n)+1二進制

到目前爲止,咱們獲得了兩個「遞歸」色彩的式子:
J(2n) = 2J(n) - 1
J(2n + 1) = 2J(n) + 1
上面涵蓋了全部「偶數」和「奇數」 ,即全部正整數,但還缺乏boundary value,做爲「遞歸系統」的第一推進力。
很簡單,J(1) = 1(最後剩下1我的,沒必要再篩選)。這樣就獲得了完整的J的遞歸方程。
這個遞歸方程的效率很是高,由於每次將n縮小至少1/2。例如,咱們用19次就能計算出J(1000000):

但若是像上面那樣就完 了,這本書真的很厲害,有好多新的思想和套路

可是不管從數學的完美意義,仍是實際的計算效率上來考慮,最好找到閉形式解咱們仍然使用「猜測證實」思路來求解封閉形式解。首先根據遞歸方程,對較小的n創建J(n)表:


能夠發現什麼規律?(若把n記爲形式n=2^m+l,其中2^m是不超過n的2的最大冪,而l則是留下的量)
一、每隔若干個位置就從1開始
二、每次從1開始的子序列都是級差爲2的等差數列
三、每一個子序列的長度是遞增的
繼續觀察,能夠看到:
一、第1子序列長度爲1,此後長度爲二、四、八、……
(謹慎懷疑子序列長度構成比值爲2的等比數列!!)
二、若是上述懷疑成立,那麼咱們只要知道當前n處於第幾個子序列的第幾個位置,就可以從1逐漸累加獲得J(n)了!!!
繼續找n和J(n)的數量關係:
假設n以前已經有m個子序列,而n是第(m+1)個子序列的第l個位置,那麼顯然有
J(n) = 1 + 2(l - 1)

n與m、l之間有什麼關係呢?
n以前的整數數量爲(1 + 2 + 4 + …… + 2^m-1) + (l - 1),所以有
n = (2^m  – 1) + l = 2^m + (l – 1)

最後咱們能夠猜想獲得封閉形式爲:J(2^m+l) = 2l + 1(m>=0,0<=l<2^m)

(注意,若2^m<=n<2^m+1,則剩餘部分l=n-2^m知足0<=l<2^m+1-2^m=2^m)

要證實:J(2^m+l) = 2l + 1(m>=0,0<=l<2^m)這確定要用到數學概括法了,可是這裏是對m概括。當m=0時,咱們必定有l=0;

所以遞歸式基礎化爲J(1)=1,概括步還分爲兩部分,依賴於l是偶數仍是奇數,若m>0和2^m+l=2n,則 l是偶數並由式J(2n) = 2J(n) - 1和概括假設可得

J(2^m+l)=2J(2^m-1+l/2)-1=2(2l/2+1)-1=2l+1,這剛好是咱們要的,同理可得,奇數情形,完成概括,此次咱們計算J(100),此時咱們獲得100=2^6+36,因此J(100)=2*36+1=73(其實,在這裏我已經以爲很厲害了,下面的更厲害)

大師發現解中2的冪起了重要做用,因此天然要看二進制表示n和J(n),假設n的二進制展開爲

n=(bmbm-1...b1b0)2;

也就是說,n=bm2^m+bm-12^m-1+...+b12+b0,其中每一個bi是0或1,且其中的第一位bm是1.想到n=2^m+1,咱們相繼獲得

n=(1bm-1bm-2...b1b0)2,l=(0bm-1bm-2...b1b0)2,2l=(bm-1bm-2...b1b01)2,2l+1=(bm-1bm-2...b1b01)2,J(n)=(bm-1bm-2...b1b0bm)2

最後一步是由J(n)=2l+1和bm=1而得出的因此咱們證實了J((bmbm-1...b1b0)2)=(bm-1...b1b0bm)2;

也就是說,以計算機程序設計的用語,循環左移一位咱們從n取得J(n)難以想象,例如若n=100=(1100100)2,則J(n)=J((1100100)2)=(1001001)2,它是64+8+1=73。

好了先就寫到這了,感受這本書在數學上真的是下了不少功夫,一步一步的引導咱們去閱讀與思考,有點上癮了,我怎麼了,等過幾天,再把另外一部分補上,由於有點多,講約瑟夫這塊。。。

相關文章
相關標籤/搜索