為了讓大家提高對循環以及判斷語句的掌握,今天分享一道經典題目《約瑟夫生者死者小游戲》。有三十個人在一條船上,但是超載了,需要十五個人下船,于是人們排成一隊,排隊的位置即是他們的編號(1-30),排好隊后,從排頭往排尾按照順序從1到9循環報數,報數到9的人就下船,如此循環,直到船上僅剩下15人。請問,有哪些人下了船?
通過解答這道題能夠提高大家繪制流程圖、理解循環體以及判斷結構的掌握程度(圖1)。

從流程圖中我們可以發現使用了一層循環、三層判斷。首先是循環報數(遍歷到最后一個再重新回到初始位置開始下一次遍歷)直到下船人數達到十五人。其次判斷遍歷的人是否還在船上,如果在,則報數;否則的話跳過本次循環,遍歷下一個人。最后是報數的內容,如果報數到9,那個人就要下船,計數器要返回1,并且下一次遍歷時就不考慮他,按照次序依次遍歷。相信大家如果能夠看懂流程圖,那么問題就可以迎刃而解了。
通過流程圖把程序的流程搞清楚之后,我們可以用任何編程語言把代碼寫出來,我這里選擇使用Python軟件來編寫,代碼如圖2。

首先外層people我選擇用字典來統計。按照循環的指示,初始情況給30個人都賦予了初始值為1。接下來新建三個變量check作為計數(0-9);i作為人們的編號(1-30);j為下船的人數,一旦下船的人數等于15,退出循環。接下來我們使用一個while循環控制,因為只有30個人所以當i循環到超過30時,手動將i設置為1,進行重復的循環遍歷,當j等于15時,代表下船的人數達到約定人數,跳出循環。
接下來就是本題最關鍵的環節——統計計數了。當people[i]為0時,表示此人已下船,i加1,繼續循環,當people[i]為1時進行check統計,每次加1,當check等于9時,代表報數到9,對應人需要下船,將此人的people[i]值設置為0,顯示j為下船的人數,下一個人j加1,運行效果如圖3。

本次實例主要考查對循環和判斷結構的理解能力,繪制流程圖是一項非常重要的技能,很多復雜的程序不可能上來就寫代碼,流程圖能夠幫助我們很好地捋順思路。