• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            第二桶 基于對象的編程 第六碗 哥倆又談遞推模型 小P三解通項公式

             

                 “唔……你下午沒有課嗎?”小P推門走進教研室,他剛剛上完數理統計,又沒有約好踢球,于是決定到教研室晃晃,一進門就看到老C趴在桌子上不知在搗鼓什么。

                 “嗯,我下午沒有課……我在研究怎么破解人類的tower rush……這個真是游戲的bug,暴雪一定會做出平衡的……”老C被小P的tower rush打得很郁悶,于是在網上找找對策。

                 “呵呵,呵呵,”小P笑道,“我們總會找到游戲中的不平衡點加以利用的……”他搖搖頭,“說到游戲,我突然想到你上次說小朋友吃蘋果的游戲,怎么可以用一個循環左移實現呢?”

                 “哦,是的是的……”老C關掉那些無聊的網頁,“你不提,我還真是險些忘了。”他接著說道,“關于這個問題,它的前提條件是每數到2的小朋友被踢出,這個 會是你在各大面試筆試中會常遇到的……”說完他指揮小P拉過白板,“這樣其實相當于求解一個2進制數的循環左移結果。”

                 “哦?那么是怎么來的呢?”小P問道。

                 “同樣,由于我們的智力有限,無法理解過于復雜的問題,所以我們先來看看幾個實際的例子。”老C說道,說著他在白板上畫了一個圈,然后在上面按順時針方向從1標到6。“我們來看看會發生什么……”老C說道,然后開始在白板上比劃起來。

                

                 “看看,我們玩過一輪后,出現了這種情況……”老C把開始的情況和玩過一輪后的情況寫了下來。

                 “小圓圈內的數字表示座位號,”老C解釋。“看看我們可以得到一些什么又用的結果。”看到小P莫名其妙的樣子,老C接著說道,“好吧,我們令T(n)表示 n個小朋友結束游戲后,剩下的小朋友的座位號碼,我們發現,當6個小朋友玩這個游戲1輪后,還剩下3個小朋友依照同樣的方式再繼續玩。”老C看到小P還是 懵懂的樣子,強調道,“注意,在這里我們發現剩下的3個小朋友需要依照同樣的方式繼續,這就表明了,其實這個問題是遞歸的。”

                 “唔,的確是這樣,這樣,求解6個小朋友玩游戲的過程,就變為求解3個小朋友玩游戲的過程了……但是……等等……我發現好像小朋友編號的規則不一樣了……”小P道。

                 “是么?”老C贊許的點點頭,“你發現有什么區別?”

                 “嗯,原來的小朋友的編號是依照座位號編號的,但是在進行1輪游戲后,剩下的3個小朋友的編號方式就不是依照座位編號了,好像是(2*座位號-1)?”小P問道。

                 “沒錯,的確是這樣,而這個就是這個遞歸問題的關鍵……”老C說道,“如果我們令T(n)為n個小朋友束游戲后,剩下的小朋友的座位號碼,那么T(n)一定是座位號碼吧?”

                 “……”小P無語點頭。

                 “但是剩下的3個小朋友如果繼續,是不是需按照新的編號規律進行編碼,才符合我們T(n)表示座位號的假定?”老C問道。

                 “……”小P搖頭。

                 “呵呵,”老C笑道,“你可以這樣認為。”說完他在白板上寫下一行公式。


            T(6) = 2 * T(3) – 1


                 “如果我們要3個小朋友玩游戲,他們的編號應當是1、2、3才對,但由于實際上他們的編號是1、3、5,所以他們的實際編號是2*T(3)-1。因為 T(3)的假定是小朋友的編號需要從1開始依次為2、3,玩游戲結束剩下的那個小朋友的號碼,但是實際上剩下的3個小朋友的編號是1、3、5,所以按照這 樣的編號玩游戲,結束時剩下的小朋友的編號就是2*T(3)-1。”老C笑道,“你仔細體會一下就明白了。”

                 “哦,有些意思……我再看看。”小P說道。他想了一會兒,覺得也不是很難以想通,于是說道,“好吧,那么然后呢?”

                 “然后我們就可以猜測這樣的遞推公式。”老C說道。


            T(n) = 2T(n/2) – 1


                 “為了好看起見,我們將上面的公式稍微更改一下。”老C又說道。


            T(2n) = 2T(n) - 1


                 “這樣我們就有了第一個遞歸公式。”老C說道。

                 “哦,看來只對偶數個小朋友起作用……如果小朋友的個數是奇數怎么辦?”小P問道。

                 “同樣,我們也找一個例子來研究一下。”老C說道。

                 

                 “同樣,我們把玩過一輪的情況畫下來。”老C說道。

                 “與上面分析的道理一樣,我們可以得到T(2n+1) = 2T(n)+1”老C說道,“你再仔細看看。”

                 小P低頭想了一會兒,說道:“嗯,沒有什么難的,這個我可以理解。”

                 “好的,這樣我們得到了遞推公式。”老C說道,“你可以假定參加游戲的小朋友是2n和2n+1個,按照類似的辦法,畫個圖,就會得到這樣的結論。”說著他在白板上寫下如下公式。


            T(1) = 1

            T(2n) = 2T(n)-1

            T(2n+1) = 2T(n)+1


                 “但是這組遞推公式無法依照我們前面的解法解出來它的通項,因為我們很難將它轉換為一個求和的方程。”老C說道,“在不知道更好的解決方法之前,我們只有拼拼人品,使用數學歸納法啦。”

                 “唔,你是說要猜測出通項公式,然后使用數學歸納法證明嗎?”小P問道。

                 “是啊是啊,”老C回答,“你好歹是本科畢業,這個應當難不倒你吧……”

                 “切,這個只要高中畢業就會了!”小P不屑。

                 “那好吧,剛好我們有一個程序可以很快的算出最后剩下小朋友的號碼,我們就來列一組表格,看看有什么規律。”老C說道。

                 于是小P打開他的電腦,開始運行前一段時間自己編寫的程序,搗鼓出來一個表格,并畫到了白板上。

             

            n

            1

            2

            3

            4

            5

            6

            7

            8

            9

            10

            11

            12

            13

            14

            15

            16

            17

            18

            19

            20

            T(n)

            1

            1

            3

            1

            3

            5

            7

            1

            3

            5

            7

            9

            11

            13

            15

            1

            3

            5

            7

            9

             

                 “看看,有什么規律啊。”小P自言自語,“唔,好像在n = 2m的時候T(n)=1,而且T(n)會隨著2m為模,很有規律的在變化。”

                 “沒錯,根據遞推公式,T(2n)=2T(n)-1,可以看出T(2)=1,T(4)=2T(2)-1=1,而T(8)=2T(4)-1=1,以此類推,所以T(2m)=1。”老C補充。

                 “好像如果n可以寫為n=2m+k的形式,則T(n)=2k+1。”小P經過一段時間的觀察,分析道,“這樣我們就可以得到通項公式。”說著他在白板上寫下通項。


            T(2m+k)=2k+1


                 “唔,這個結論對不對呢,我來用數學歸納法證明一下。”小P說道。于是他在白板上比劃起來。

             

            令n = 2m+k,

            當n = 1時,m = 0,k = 0

            T(1) = 2k + 1 = 1,原式成立。

            設當n = 2m + k時,T(n) = 2k + 1

            那么當n = 2m + k + 1時,若n是偶數,那么k+1是偶數,有

            T(2n) = 2T(n) – 1

            T(2(2m-1+(k+1)/2)) = 2T(2m-1+(k+1)/2) – 1 = 2(2(k+1)/2 + 1)-1 = 2(k+1) -1

            等式仍然成立。

            若n是奇數,那么k是偶數,有

            T(2n+1) = 2T(n) + 1

            T(2(2m-1+k/2)+1) = 2T(2m-1+k/2) +1 = 2(2k/2+1) +1 = 2k+3 = 2(k+1) + 1

            等式仍然成立。

            綜上,原通項成立。

             

                 “嗯,看來我們的猜測是正確的。”小P道,“但是這個與循環左移有什么關系呢?”

                 “因為T(n)會以2m為模有規律的變化,這樣促使我們使用2進制數看看有什么有趣的規律。”老C說道。

             

            設n可以表示為2進制數bmbm-1bm-2…b0,且bk非1即0,則

            n = bm2m + bm-12m-1 + bm-22m-2 +…+ b0

            且bm = 1

            那么

            k = bm-12m-1 + bm-22m-2 +…+ b0

            2k = bm-12m + bm-22m-1 +…+ 2b0

            2k + 1 = bm-12m + bm-22m-1 +…+ 2b0 + 1 = bm-12m + bm-22m-1 +…+ 2b0 + bm

             

             

                 “看看,這就相當于對n的2進制數做了循環左移一樣!”老C說道。

                 “……”小P低著頭看了半天,“嗯,沒錯,好像是這樣。我們來帶入幾個數值看看吧。”小P把上面幾個表的數據拿來看看。

             

            5 = (101)2

            T(5) = 3 = (11)2

             

            20 = (10100)2

            (1001)2 = 9 = T(20)

             

                 “唔,看來確是如此。”小P贊嘆道,“這還真是奇妙的事情。”

                 “是啊是啊,所以你以后在面試和筆試的時候,碰到相同的問題,就無需寫出大堆的代碼啦,只要寫一個實現循環左移的函數就可以了。”老C回答。

                 “嗯……”小P點點頭,“既然數到2的小朋友被踢出的結果可以用一個循環左移表示,那么數到3,數到4……數到n被踢出的結果有什么好的方法表示呢?”小P追問。

                 “呵呵,”老C笑道,“我看到了你光明的未來……”他點點頭,“這些并沒有什么現成的結論,你可以根據編寫好的程序,自己生成一些數據表格,看看有什么特 殊的規律。我猜如果這些數字以3為模,可能與3進制有關聯;如果以4為模,可能和4進制有關……Any way,你可以進行一些嘗試,看能否得出一些有趣的結論。等你總結好了,別忘了告訴我……”

                 “好啊,不過到時你可得請我吃飯啊!”小P道。

                 “那是當然……”老C笑道,“我們關于遞推的討論先暫時告一段落,我覺得你差不多也算上道了,所以我們開始要進行一些更有趣的活動……”

                 “……”小P無語,“你又找到什么好館子了?”

                 “……”老C囧,“不是,是我覺得應當可以系統的開始一些工作了。”

                 “哦?什么是系統的工作?”小P不解。

                 “還記得《Teach Yourself Programming in Ten Years》嗎?這本書提到,在項目中學習是很好很強大的。因此……我們現在可以開始一個項目了。”老C回答。

                 “哦?什么項目?”小P奇道。

                 “先從一個桌面計算器開始吧。”老C說道,“一個自由風格的計算器,可以對數學運算進行計算,并可以進行一些簡單的公式計算。”他想想,“就像最簡單的matlab。”

                 “是嗎?”小P興奮道,“這真是很酷的事情。”

                 “既然要做,我們就很正規、正式、正經、正確、正……哦,”看到小P幽怨的眼神,老C趕快打住,“我們就按照正規的、科學的過程來做。”

                 “那么怎么才算是正規和科學呢?”小P追問。

                 “很好,”老C滿意的點頭,“希望你保持這種旺盛的求知欲望。”他找到杯子喝了一口水,“所謂正規和科學,是使得我們的開發活動有序、可控和可度量。如何 做到這些,我也無法一時說清楚,等到我們進行一段時間,你可能就會產生一些體會了。你記住現在腦海中產生的問題,讓我們在實踐中慢慢解答。但是在開始我們 的項目之前,還有一些鋪墊的東西必須先進行一下。”

                 “哦?有哪些呢?”小P問道。

                 “技術和技能可以一邊隨著項目的進行一邊訓練,但一些知識性的問題要先來。”老C回答,“第一,我們要先學習一下遞歸下降語法分析;第二,我們還要學習一 下有限狀態機;第三,我們要了解一些配置管理方面的知識;第四,了解一些簡單的關于項目方面的概念;當這些問題我們都有過一些簡單的討論后,我們就可以開 始一個簡單的關于桌面計算器的小項目啦,而在所有這些過程中,我們都會穿插進行一些數據結構與算法的討論。”

                  “是么?我倒是有些迫不及待啦。”小P應道。看到老C指著肚子,小P笑道,“當然,我會請你吃頓好的,因為害怕你藏私貨,所以我決定下血本請你吃麻辣燙……”

                 兩人一邊說笑,一邊到隔壁叫上同學,殺出門外……

             




            posted on 2009-04-13 16:02 Anderson 閱讀(1562) 評論(4)  編輯 收藏 引用

            評論

            # re: 第二桶 基于對象的編程 第六碗 哥倆又談遞推模型 小P三解通項公式 2009-04-29 23:31 JIN

            不錯~  回復  更多評論   

            # re: 第二桶 基于對象的編程 第六碗 哥倆又談遞推模型 小P三解通項公式[未登錄] 2009-05-15 15:52 Anderson

            考試臨近,停止更新……
            6月27日考試……書還沒有看完呢……  回復  更多評論   

            # re: 第二桶 基于對象的編程 第六碗 哥倆又談遞推模型 小P三解通項公式 2009-05-21 20:30 supersand

            兄弟還是在校學生嗎?  回復  更多評論   

            # re: 第二桶 基于對象的編程 第六碗 哥倆又談遞推模型 小P三解通項公式[未登錄] 2009-06-04 15:28 Anderson

            已經畢業啦。^_^  回復  更多評論   

            <2009年6月>
            31123456
            78910111213
            14151617181920
            21222324252627
            2829301234
            567891011

            導航

            統計

            常用鏈接

            留言簿(6)

            隨筆檔案(21)

            文章檔案(1)

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            国产精品久久永久免费| 久久人人妻人人爽人人爽| 久久播电影网| 久久亚洲2019中文字幕| 久久天天躁狠狠躁夜夜2020一| 色婷婷综合久久久久中文一区二区 | 国产美女亚洲精品久久久综合| 久久偷看各类wc女厕嘘嘘| 久久久99精品成人片中文字幕| 偷偷做久久久久网站| 91精品国产91热久久久久福利 | 日本三级久久网| 一极黄色视频久久网站| 99久久精品免费看国产免费| 国产亚洲精久久久久久无码77777 国产亚洲精品久久久久秋霞 | 久久se精品一区二区影院| 亚洲av伊人久久综合密臀性色 | 久久人人爽人人爽人人片AV东京热| 伊人久久大香线蕉av不卡| 无码任你躁久久久久久老妇| 伊人久久综在合线亚洲2019| 久久精品无码一区二区无码| 欧美与黑人午夜性猛交久久久 | 亚洲中文字幕无码久久2017| 久久无码国产| 久久免费精品视频| 国产午夜免费高清久久影院| 久久精品无码专区免费东京热 | 99精品久久久久久久婷婷| 人妻系列无码专区久久五月天| 99久久国产综合精品五月天喷水 | 2020国产成人久久精品| 中文字幕久久亚洲一区| 久久九九兔免费精品6| 久久人与动人物a级毛片| 国产亚洲精久久久久久无码77777| 久久综合鬼色88久久精品综合自在自线噜噜 | 2021国产精品久久精品| 欧美激情一区二区久久久| 精产国品久久一二三产区区别| 久久国产免费直播|