為了讓大家提高對(duì)循環(huán)以及判斷語(yǔ)句的掌握,今天分享一道經(jīng)典題目《約瑟夫生者死者小游戲》。有三十個(gè)人在一條船上,但是超載了,需要十五個(gè)人下船,于是人們排成一隊(duì),排隊(duì)的位置即是他們的編號(hào)(1-30),排好隊(duì)后,從排頭往排尾按照順序從1到9循環(huán)報(bào)數(shù),報(bào)數(shù)到9的人就下船,如此循環(huán),直到船上僅剩下15人。請(qǐng)問,有哪些人下了船?
通過解答這道題能夠提高大家繪制流程圖、理解循環(huán)體以及判斷結(jié)構(gòu)的掌握程度(圖1)。
從流程圖中我們可以發(fā)現(xiàn)使用了一層循環(huán)、三層判斷。首先是循環(huán)報(bào)數(shù)(遍歷到最后一個(gè)再重新回到初始位置開始下一次遍歷)直到下船人數(shù)達(dá)到十五人。其次判斷遍歷的人是否還在船上,如果在,則報(bào)數(shù);否則的話跳過本次循環(huán),遍歷下一個(gè)人。最后是報(bào)數(shù)的內(nèi)容,如果報(bào)數(shù)到9,那個(gè)人就要下船,計(jì)數(shù)器要返回1,并且下一次遍歷時(shí)就不考慮他,按照次序依次遍歷。相信大家如果能夠看懂流程圖,那么問題就可以迎刃而解了。
通過流程圖把程序的流程搞清楚之后,我們可以用任何編程語(yǔ)言把代碼寫出來,我這里選擇使用Python軟件來編寫,代碼如圖2。
首先外層people我選擇用字典來統(tǒng)計(jì)。按照循環(huán)的指示,初始情況給30個(gè)人都賦予了初始值為1。接下來新建三個(gè)變量check作為計(jì)數(shù)(0-9);i作為人們的編號(hào)(1-30);j為下船的人數(shù),一旦下船的人數(shù)等于15,退出循環(huán)。接下來我們使用一個(gè)while循環(huán)控制,因?yàn)橹挥?0個(gè)人所以當(dāng)i循環(huán)到超過30時(shí),手動(dòng)將i設(shè)置為1,進(jìn)行重復(fù)的循環(huán)遍歷,當(dāng)j等于15時(shí),代表下船的人數(shù)達(dá)到約定人數(shù),跳出循環(huán)。
接下來就是本題最關(guān)鍵的環(huán)節(jié)——統(tǒng)計(jì)計(jì)數(shù)了。當(dāng)people[i]為0時(shí),表示此人已下船,i加1,繼續(xù)循環(huán),當(dāng)people[i]為1時(shí)進(jìn)行check統(tǒng)計(jì),每次加1,當(dāng)check等于9時(shí),代表報(bào)數(shù)到9,對(duì)應(yīng)人需要下船,將此人的people[i]值設(shè)置為0,顯示j為下船的人數(shù),下一個(gè)人j加1,運(yùn)行效果如圖3。
本次實(shí)例主要考查對(duì)循環(huán)和判斷結(jié)構(gòu)的理解能力,繪制流程圖是一項(xiàng)非常重要的技能,很多復(fù)雜的程序不可能上來就寫代碼,流程圖能夠幫助我們很好地捋順?biāo)悸贰?/p>