Python編程算法【十五】 分糖果
【案例內(nèi)容】
10個小朋友圍成一圈分糖果,老師分給第1個小朋友10塊糖果,第2個小朋友2塊糖果,第2個小朋友8塊,第4個小朋友22塊,第5個小朋友16塊,第6個小朋友4塊,第7個小朋友10塊,第8個小朋友6塊,第9個小朋友14塊,第10個小朋友20塊。然后所有小朋友同時將手中的糖果分一半給右邊的小朋友,如果糖果數(shù)為奇數(shù)的小朋友,可以找老師要一塊。請問,經(jīng)過這樣操作幾次后,大家的糖果數(shù)一樣多?每個人各有多少塊糖果?
【解題思路】
用一列表存儲10個小朋友的糖果數(shù),如 candies = [10, 2, 8, 22, 16, 4, 10, 6, 14, 20],接著判斷其中是否存在奇數(shù)的糖果數(shù),若有則將其+1,也就是題目中“找老師要一塊”。若沒有,則可使用列表推導式,快速獲得取半后的新列表。根據(jù)題意,第1個小朋友把自己的一半交給第2個小朋友,以此同時,第2個小朋友也把自己的一半交給第3個小朋友,按此操作,直到第10個小朋友把自己的一半交給第1個小朋友。需注意的是,每個小朋友要先把自己手中一半的糖果交給下一位,再獲取上一位小朋友的糖果。使用循環(huán)反復操作后,最終每個小朋友的糖果數(shù)一樣多即停止,并得出循環(huán)的次數(shù),以及每個小朋友最終的糖果數(shù)。
【Python代碼】


在編程過程中,如果邏輯結(jié)構(gòu)比較多,可以考慮采用函數(shù)來解決,避免將所有代碼都雜糅在一起,不方便查看和分析。本題用1個函數(shù)專門處理糖果為奇數(shù)的過程;用1個函數(shù)專門處理將自己糖果數(shù)一半分出去,并加上前一位傳過來的糖果數(shù),此時可先處理第10個小朋友傳給第1個小朋友的糖果數(shù),再用循環(huán)處理后面9位小朋友的糖果數(shù)。最后再用1個函數(shù)專門判斷列表中的數(shù)值是否相等,即糖果數(shù)是否一樣,返回值是True或False。主程序中,設(shè)置變量n,記錄次數(shù),通過while循環(huán)進行累加,直到最終糖果數(shù)一樣時,得出n的值,此時candies列表中的每個數(shù)值也都相等。