国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于Josephus問題的C語(yǔ)言教學(xué)設(shè)計(jì)分析

2014-07-12 03:04:12劉東良
滁州學(xué)院學(xué)報(bào) 2014年2期
關(guān)鍵詞:報(bào)數(shù)鏈表數(shù)組

劉東良

C語(yǔ)言教學(xué)案例較多,內(nèi)容涉及較多學(xué)科內(nèi)容,無(wú)疑增大了初學(xué)者的學(xué)習(xí)認(rèn)知負(fù)擔(dān)。為滿足C語(yǔ)言的教學(xué)需要,以一例"Josephus問題"貫通全部教學(xué)內(nèi)容的方式設(shè)計(jì)案例。通過Josephus問題的多種變形描述,使其內(nèi)容覆蓋標(biāo)準(zhǔn)C語(yǔ)言的全部知識(shí)單元,這樣設(shè)計(jì)能大大的減輕C語(yǔ)言學(xué)習(xí)者的學(xué)習(xí)難度,無(wú)需費(fèi)時(shí)費(fèi)力在求解問題本身的理解上,從而使學(xué)生能更好地理解、掌握C語(yǔ)言基礎(chǔ)知識(shí),一例貫通,舉一反三。同時(shí),增加無(wú)窮的樂趣和探索精神;加深學(xué)習(xí)者對(duì)C語(yǔ)言知識(shí)深度理解和靈活掌握;盡早盡快掌握C語(yǔ)言內(nèi)容和編程技能,能夠進(jìn)行簡(jiǎn)單的應(yīng)用程序設(shè)計(jì)。

1 Josephus問題和求解

據(jù)說古代羅馬軍隊(duì)中有一種懲罰習(xí)慣:如一個(gè)連隊(duì)因怯懦、反叛或其他理由受到懲罰時(shí),采用"見十去一(decimatio)"的辦法進(jìn)行處罰,即將隊(duì)伍中凡是站在10的倍數(shù)位置上的人處死。有關(guān)的事例可以追溯到公元前5世紀(jì)。類似的方法在古代的民事戰(zhàn)爭(zhēng)中被使用,但不一定是"見十去一",也有其他的淘汰比率,如"見二十去一(vicesimatio)"、"見百去一(centesimatio)"等等。Josephus問題就是從此演變而來(lái)。

Josephus問題的基本形式是將k個(gè)子排成一圈,在這個(gè)圈中以某子為起點(diǎn),m個(gè)m個(gè)數(shù)子,將每次數(shù)到的第m子去掉,直到去掉k-n子為止。問保留下來(lái)的n子在原來(lái)的圈中應(yīng)排在哪些位置上。

Josephus問題的求解是數(shù)學(xué)問題,用計(jì)算機(jī)語(yǔ)言設(shè)計(jì)程序求解各種約瑟夫及其變形問題具有現(xiàn)代意義和價(jià)值。蘇格蘭數(shù)學(xué)家Peter Guthrie Tait給出這個(gè)問題的通解后,Josephus'Problem,又被稱為 Tait's Problem。

這就是泰特的算法。該算法是一種遞推的解法。n是總數(shù),m是報(bào)數(shù)即間隔數(shù),而i是循環(huán)變量,注意它是從2開始的初始條件,r+1為結(jié)果又稱Josephus Number約瑟夫數(shù)。

至今可以檢索到許多種算法描述Josephus問題。在這些算法中,主要是利用一維數(shù)組或者循環(huán)鏈表進(jìn)行求解。一般地,假設(shè)有一組數(shù)據(jù)構(gòu)成一個(gè)序列圈(序列的最后一個(gè)數(shù)據(jù)視為與第一個(gè)數(shù)據(jù)相鄰接)。要求從第s個(gè)數(shù)據(jù)開始計(jì)數(shù),計(jì)數(shù)到m時(shí)彈出該數(shù)據(jù),然后從它的下一個(gè)數(shù)據(jù)重新開始計(jì)數(shù),計(jì)數(shù)到m時(shí)又彈出該數(shù)據(jù),……,直到彈出序列中的所有數(shù)據(jù)(或只剩下一個(gè)或若干數(shù)據(jù))為止。對(duì)于任意給定的自然數(shù)s和m,試求出這組數(shù)據(jù)的彈出次序。這種描述形式的Josephus問題隱藏了k值,而且對(duì)數(shù)據(jù)類型沒有具體要求,數(shù)據(jù)元素可以是整數(shù)、實(shí)數(shù)、字符或字符串?dāng)?shù)據(jù),甚至還可以是結(jié)構(gòu)體,通用性好,實(shí)用性強(qiáng)。

2 C語(yǔ)言教學(xué)單元設(shè)計(jì)分析

用C語(yǔ)言實(shí)現(xiàn)不同Josephus問題的解法,以Josephus問題描述C語(yǔ)言的各知識(shí)點(diǎn),進(jìn)行一例貫通式教學(xué)設(shè)計(jì)。

2.1 變量和結(jié)構(gòu)化設(shè)計(jì)分析

以變量代表子,體現(xiàn)變量存儲(chǔ)數(shù)據(jù)的作用。Josephus問題有k個(gè)子,起點(diǎn)位置s,m個(gè)數(shù)子,保留的n子等4個(gè)變量。對(duì)Josephus問題變形可以擴(kuò)展更多的變量,比如,在執(zhí)行程序前,猜哪幾個(gè)是獲勝者,能得到游戲者的成績(jī),設(shè)定一個(gè)猜中數(shù)w變量;再如,最后必須相鄰的兩個(gè)子ki,ki+1的編號(hào)或位置;以及報(bào)數(shù)時(shí)方向順時(shí)針或逆時(shí)針;或者將固定m改為不定密碼等更多變量。

使用整型數(shù)據(jù)類型的5個(gè)變量實(shí)現(xiàn)Josephus。學(xué)習(xí)while循環(huán),switch、if條件,順序三種基本結(jié)構(gòu)的應(yīng)用;小孩使用5個(gè)整型變量描述,T是宏,大小不可改變;開始位置,報(bào)數(shù),獲勝數(shù)三個(gè)變量;使用#define定義5整型變量。使用C語(yǔ)言中的整型、字符型或者浮點(diǎn)類型僅僅是順序編號(hào)的標(biāo)示問題。

以變量代表子的解法能深刻揭示Josephus問題的本質(zhì),需要C語(yǔ)言的知識(shí)也是最富技巧性。如switch和goto語(yǔ)句使得程序運(yùn)行起來(lái),無(wú)限和有限循環(huán)while、for語(yǔ)句則揭示計(jì)算機(jī)擅長(zhǎng)的重復(fù)工作,變量的順序則明確C語(yǔ)言的語(yǔ)句順序執(zhí)行的重要性。

2.2 數(shù)組設(shè)計(jì)分析

以靜態(tài)數(shù)組定義固定k,限制程序的實(shí)用性。k個(gè)子用數(shù)組表示而且是靜態(tài)的數(shù)組。對(duì)于數(shù)學(xué)問題使用靜態(tài)數(shù)組就可很好解決Josephus問題,數(shù)組在理解和使用時(shí)都比較簡(jiǎn)潔方便。利用一維數(shù)組求解Josephus問題時(shí),數(shù)組的大?。磾?shù)組元素的個(gè)數(shù))由k值確定。在定義數(shù)組之前,必須先給定k值。這個(gè)先決條件限制了這類算法的實(shí)用性,因?yàn)樵谠S多應(yīng)用領(lǐng)域,事先不知道k的確切值。C/C++語(yǔ)言定義數(shù)組的大小,要求使用常量或常變量,為了適應(yīng)k值,經(jīng)常需要"大開小用"(不可能使用修改源代碼的方法),浪費(fèi)內(nèi)存資源。此外,如需要輸出字符型數(shù)據(jù)(如姓名或字符類型的編號(hào)等),則需使用二維數(shù)組進(jìn)行描述。利用數(shù)組求解Josephus問題的算法比較簡(jiǎn)練,易于描述。

數(shù)組是有序的、線性的、連續(xù)的結(jié)構(gòu),要模擬Josephus問題的環(huán)或圈結(jié)構(gòu),可以使用i=(i+1)%T;構(gòu)成"圈",即當(dāng)循環(huán)變量i加1與總數(shù)相等時(shí),i重新歸為0,實(shí)現(xiàn)了當(dāng)沿著數(shù)組"直線"向前數(shù)時(shí),到最后一個(gè)元素后,跳回至第一個(gè)元素。注意C語(yǔ)言數(shù)組下標(biāo)從0開始,所以i要加1。另外,還可以使用下面三種表達(dá)方式達(dá)到同樣效果。

修改小孩數(shù)組總數(shù)可改變T的大小,一般小于50,便于整個(gè)程序在較短時(shí)間內(nèi)完成。N+1,N-1,N*m則分別實(shí)現(xiàn)數(shù)組元素后移,數(shù)組元素刪除和一次申請(qǐng)所有空間的算法,體現(xiàn)數(shù)組的不同應(yīng)用。

2.3 指針設(shè)計(jì)分析

動(dòng)態(tài)數(shù)組描述不定K,效率高通用性好。k個(gè)子用數(shù)組表示,是動(dòng)態(tài)的即k子數(shù)不定,程序根據(jù)輸入的不同值計(jì)算得到最后結(jié)果。在實(shí)際程序應(yīng)用中,或者考慮大數(shù)據(jù)量運(yùn)算或者考慮效率,往往采用堆棧動(dòng)態(tài)數(shù)組比較合適,既能高效率地執(zhí)行程序,又能保障結(jié)果準(zhǔn)確。

用整數(shù)i來(lái)代替p[i],將初始序列看成一個(gè)整數(shù)序列存儲(chǔ)在向量p中,p[i]出列,將p[i+1],……,p[n]前移一個(gè)元素,將p[i]放入p[n]中,最后出列放在p[1]中。指向各編號(hào)的position指針形成動(dòng)態(tài)數(shù)組,該程序可不限定k子個(gè)數(shù),使程序的通用性更好。

2.4 函數(shù)設(shè)計(jì)分析

函數(shù)進(jìn)行模塊化設(shè)計(jì),理解C語(yǔ)言驅(qū)動(dòng)機(jī)制。C語(yǔ)言又稱函數(shù)語(yǔ)言,其函數(shù)設(shè)計(jì)簡(jiǎn)潔,沒有函數(shù)與過程區(qū)分。我們可以很容易地將各種設(shè)計(jì)封裝成函數(shù),進(jìn)行模塊化設(shè)計(jì);學(xué)生也比較容易理解函數(shù)的復(fù)用意義和模塊化好處,難點(diǎn)是函數(shù)調(diào)用機(jī)制的理解。

C語(yǔ)言函數(shù)調(diào)用遵循嵌套調(diào)用的原則。設(shè)計(jì)一個(gè)遞歸的Josephus問題演示函數(shù)調(diào)用機(jī)制。JosephusRecur遞歸函數(shù),函數(shù)參數(shù)依次為k子總數(shù),開始報(bào)數(shù)位置,間隔報(bào)數(shù),猜數(shù)和離開時(shí)序數(shù)。

只有封裝成函數(shù),才能直接或間接調(diào)用自己,從而形成遞歸調(diào)用。函數(shù)模塊化設(shè)計(jì)在許多Josephus問題解法中都有所使用。

2.5 結(jié)構(gòu)設(shè)計(jì)

結(jié)構(gòu)數(shù)組封裝K子多元信息。用結(jié)構(gòu)數(shù)組封裝k子的信息,比如設(shè)計(jì)小孩或八仙的名稱、年齡、生日等不同類型變量。這些成員可以靜態(tài)或動(dòng)態(tài)設(shè)定,從而達(dá)到使用不同類型變量和自定義數(shù)據(jù)類型的目的。同時(shí),理解數(shù)組與結(jié)構(gòu)重要區(qū)別之一是數(shù)組為同類型而結(jié)構(gòu)體可以是不同數(shù)據(jù)類型的成員。

結(jié)構(gòu)數(shù)組并沒有使用新的解法,只是比數(shù)組增加了必要的輔助信息,這是從簡(jiǎn)單的樣例程序到實(shí)用商業(yè)程序發(fā)展的重要步驟。

2.6 鏈表設(shè)計(jì)分析

結(jié)構(gòu)鏈表模擬Josephus問題過程,直觀形象。因?yàn)镴osephus問題本身是環(huán)型,即首尾相聯(lián)結(jié),循環(huán)依次報(bào)數(shù)。所以利用循環(huán)鏈表進(jìn)行Josephus問題求解,是一種比較理想的方法,主要體現(xiàn)在:一個(gè)循環(huán)鏈表可以被看成是一個(gè)圈,可以直接映射問題本身;一般采用動(dòng)態(tài)分配內(nèi)存的方法建立循環(huán)鏈表(即"按需分配"),可節(jié)省存儲(chǔ)空間,而且不必事先給定n的值,實(shí)用性強(qiáng);從循環(huán)鏈表中的任何一個(gè)結(jié)點(diǎn)出發(fā),沿指針指向進(jìn)行搜索,可以訪問到鏈表中的所有結(jié)點(diǎn);刪除鏈表中相應(yīng)的結(jié)點(diǎn)元素值并釋放該結(jié)點(diǎn)。釋放結(jié)點(diǎn)可以縮短鏈表的長(zhǎng)度(即可降低算法的時(shí)間復(fù)雜度),且有利于存儲(chǔ)資源的再利用。但利用循環(huán)鏈表求解Josephus問題的算法相對(duì)較復(fù)雜,需要一定的基礎(chǔ)和技巧。

結(jié)構(gòu)鏈表的設(shè)計(jì)主要意圖是學(xué)習(xí)鏈表的知識(shí)內(nèi)容,直觀展示指針的"指向"作用,通過指針的"拉鏈"、"斷鏈"、"脫鏈"等顯示鏈表操作過程。

在結(jié)構(gòu)鏈表的基礎(chǔ)上可進(jìn)一步擴(kuò)展單向和雙向以及循環(huán)鏈表的內(nèi)容。雙向循環(huán)鏈表豐富了Josephus問題多樣性。通過結(jié)構(gòu)體包含編號(hào),密碼(報(bào)數(shù))和方向?qū)崿F(xiàn)不定報(bào)數(shù)和不定方向,充分展示Josephus問題趣味性??蓭ь^結(jié)點(diǎn)的單鏈表結(jié)構(gòu)定義和不帶頭結(jié)點(diǎn)的單環(huán)鏈表結(jié)構(gòu)定義設(shè)計(jì)。

通過指針,C語(yǔ)言可很容易地實(shí)現(xiàn)鏈表,從而更好地理解指針的作用及其重要性。

2.7 隊(duì)列設(shè)計(jì)分析

以隊(duì)列形式反映Josephus問題本質(zhì)。Josephus問題本質(zhì)上是一種環(huán)型隊(duì)列,故使用"先進(jìn)先出"隊(duì)列結(jié)構(gòu)可更好地實(shí)現(xiàn)Josephus問題求解。隊(duì)列是一種常用的數(shù)據(jù)結(jié)構(gòu),一般C語(yǔ)言教學(xué)中,沒有或很少涉及到。通過Josephus問題理解和掌握隊(duì)列結(jié)構(gòu)則是很容易達(dá)到的。

2.8 棧設(shè)計(jì)分析

以棧體現(xiàn)函數(shù)調(diào)用機(jī)制。為了展現(xiàn)程序執(zhí)行時(shí),函數(shù)調(diào)用機(jī)制與"先進(jìn)后出"的棧特性,設(shè)計(jì)雙棧完成Josephus問題解法,程序運(yùn)行效果特別形象直觀。函數(shù)調(diào)用機(jī)制是現(xiàn)代程序語(yǔ)言特性,掌握堆棧就是掌握程序的驅(qū)動(dòng)原理。

2.9 樹設(shè)計(jì)分析

結(jié)構(gòu)決定效率。以樹結(jié)構(gòu)可以提高Josephus程序運(yùn)行效率。使用Range Tree實(shí)現(xiàn)Josephus數(shù)的計(jì)算是效率比較高的,時(shí)間復(fù)雜度為O(nlogn),而一般鏈表為O(n*m),數(shù)組為 O(n2)。其中n為總數(shù),m為報(bào)數(shù)。范圍樹Range Tree以樹狀層次結(jié)構(gòu)代替線性結(jié)構(gòu),提高查找效率,從而提高程序整體效率。

2.10 文件設(shè)計(jì)分析

文件記錄Josephus問題的元數(shù)據(jù)和過程。C語(yǔ)言的標(biāo)準(zhǔn)輸入輸出包含了文件操作,是在初學(xué)階段就應(yīng)該掌握的基礎(chǔ)內(nèi)容。從文件讀取Josephus問題的元數(shù)據(jù),執(zhí)行后,將解法過程和結(jié)果都保存到文件中去,便于理解。在結(jié)果文件中:

第一行5是總數(shù),1是開始位置,3是間隔報(bào)數(shù),1是最后一個(gè)獲勝;第二行至第六行是每次在圈里的號(hào)碼,豎線后是出圈的號(hào)碼。

2.11 位運(yùn)算設(shè)計(jì)分析

位運(yùn)算展示Josephus問題特性。通常位運(yùn)算沒有比較好的教學(xué)案例,而Josephus問題的一個(gè)特例,當(dāng)m為2即每次向后移動(dòng)即間隔一個(gè)子時(shí),使用位運(yùn)算則能非常高效地求出約瑟夫數(shù)。

從二進(jìn)制的角度理解為:將n左移1位(即乘2),然后將最右端設(shè)置為1(即加1),最后將左端的1置為0(即減去2*n的向下取的2的冪)。更簡(jiǎn)單的描述是將n的二進(jìn)制表示循環(huán)左移動(dòng)一位!如:n為1011001->0110011->1100110。對(duì)應(yīng)代碼:

該語(yǔ)句是每次把N二進(jìn)制最右邊的1修改為0,直到最左邊的1為止.這種方法也可以用來(lái)計(jì)算N二進(jìn)制中1的數(shù)目,當(dāng)N二進(jìn)制中1的數(shù)目比較小的時(shí)候算法的效率很高。

2.12 程序測(cè)試設(shè)計(jì)分析

測(cè)試是學(xué)習(xí)計(jì)算機(jī)語(yǔ)言必須學(xué)習(xí)的內(nèi)容之一。測(cè)試是檢驗(yàn)程序正確性并完善程序。它不同于程序編寫、調(diào)試,而是對(duì)既成的程序,運(yùn)行特定測(cè)試數(shù)據(jù)(稱為測(cè)試用例)驗(yàn)證其結(jié)果正確性。調(diào)試程序階段主要活動(dòng)在程序本身的編寫過程,執(zhí)行或簡(jiǎn)單得到結(jié)果后即告結(jié)束,而測(cè)試剛剛開始。

窮舉法測(cè)試八仙定座。呂洞賓在2號(hào)位不變,其它仙人隨機(jī),使用兩粒骰子產(chǎn)生點(diǎn)數(shù)進(jìn)行報(bào)數(shù),所以有11種可能,呂洞賓是不可能坐上首席的,窮舉法測(cè)試八仙定座程序正確性。

3 Josephus問題的C語(yǔ)言設(shè)計(jì)教學(xué)效果

實(shí)際教學(xué)中,整理、設(shè)計(jì)52個(gè)Josephus問題解法,并利用圖形函數(shù)設(shè)計(jì)了22個(gè)動(dòng)畫演示程序。學(xué)生對(duì)Josephus問題比較感興趣,還能主動(dòng)思考求解Josephus問題的新方法,達(dá)到了良好的教學(xué)效果。

以Josephus問題典型案例,設(shè)計(jì)C語(yǔ)言教學(xué)內(nèi)容無(wú)疑是一次教學(xué)改革和探索,希望能不斷改進(jìn)和完善,使得該研究取得更理想效果。

[1]沈康身.東方約瑟夫問題研究選析[J].自然科學(xué)史研究,2003:22(1):60-68.

[2][美]格雷厄姆.具體數(shù)學(xué)[M].西安:西安電子科技大學(xué)出版社,1992:116.

[3]郭世榮.方中通《數(shù)度衍》中所見的約瑟夫斯問題[J].自然科學(xué)史研究,2002:21(1):49-55.

[4]陳海山.Josephus問題的算法設(shè)計(jì)與應(yīng)用研究[J].計(jì)算機(jī)工程與應(yīng)用,2007:43(1):61-64.

猜你喜歡
報(bào)數(shù)鏈表數(shù)組
報(bào)數(shù)游戲
JAVA稀疏矩陣算法
JAVA玩轉(zhuǎn)數(shù)學(xué)之二維數(shù)組排序
基于二進(jìn)制鏈表的粗糙集屬性約簡(jiǎn)
跟麥咭學(xué)編程
基于鏈表多分支路徑樹的云存儲(chǔ)數(shù)據(jù)完整性驗(yàn)證機(jī)制
報(bào)數(shù)與抱樹
報(bào)數(shù),抱樹
尋找勾股數(shù)組的歷程
鏈表方式集中器抄表的設(shè)計(jì)
鲁甸县| 蒙城县| 贺州市| 荥经县| 霍邱县| 永平县| 收藏| 广丰县| 南皮县| 宁化县| 色达县| 华池县| 林州市| 永德县| 若尔盖县| 盐山县| 阿拉尔市| 苍溪县| 永福县| 浙江省| 张家港市| 北票市| 北辰区| 湄潭县| 定南县| 民丰县| 景德镇市| 宁蒗| 梁平县| 根河市| 剑阁县| 屯门区| 汉川市| 昌平区| 嘉定区| 华蓥市| 班玛县| 香格里拉县| 山西省| 千阳县| 石城县|