宮裡新晉了十幾名嬪妃,皇上說,“朕有一批上好的蜀錦料子,想要分於各位,朕今日心情大好,倒不如一起來玩個遊戲!”。
皇上繼續說道,“遊戲規則是這樣的:有n名嬪妃圍坐成一圈,朕給每位嬪妃都隨機分發偶數匹蜀錦,然後開始遊戲,遊戲中每位嬪妃都需要把自己蜀錦的一半分給左側的嬪妃。一輪遊戲後,擁有奇數匹蜀錦的嬪妃朕會再補給一匹蜀錦,從而變成偶數。反覆進行這個遊戲,直到各位嬪妃手上的蜀錦數量相同為止”。
此時,皇上在思考:在已知初始蜀錦數的情況下,朕一共需要補發多少匹蜀錦呢?
問題整理
我們來幫助皇上解決這個疑惑,根據故事情節,題目要求如下:
要求:
<code>輸入: ① 程序首先讀入一個整數n(2/<code>
樣例:
<code>輸入:> 請輸入嬪妃人數:3
> 請輸入每人的初始蜀錦數(用空格隔開):2 2 4
輸出:> 皇上需要補發4匹蜀錦
/<code>
思路分析
我們可以看出該問題屬於遞歸類問題,因此我們需要定義遞歸函數來解決這個問題。
我們把每位嬪妃的蜀錦數定義在列表變量list中,然後構造一個遞歸函數shareCloths(n,list),其中n為嬪妃標識,list表示每位嬪妃手上的蜀錦數。我們把每位嬪妃蜀錦數的一半也記錄在一個新的列表變量halfList中,當然list和halfList這兩個列表中每位嬪妃的順序是一致的。
好了,接下來就是分配蜀錦的過程了,每位嬪妃把自己蜀錦的一半都給左側的人,分完一輪之後再依次判斷每人手上的蜀錦數是否為奇數,如果是,則皇上應補一匹,程序中別忘記記錄補發的蜀錦數喔!
程序最後,我們再來判斷每位嬪妃的蜀錦數是否相等,如果相等則可求得皇上需補發的蜀錦數,如果不相等則繼續遞歸函數。
分析到這裡,我相信很多朋友已經開始著手嘗試編寫代碼了。如果你還沒有代碼編寫思路,沒關係,跟著我一起來看看如何用Python代碼實現它,出發!
代碼實現
① 定義全局變量,並定義遞歸函數shareCloths(n,list):
② 用列表halfList來記錄當前每位嬪妃蜀錦數的1/2:
③ 每位嬪妃把自己蜀錦的1/2分給左側的嬪妃:
注意:最後一位嬪妃的蜀錦數 = 第一位嬪妃上一輪的蜀錦數的1/2 + 最後一位嬪妃的蜀錦數的1/2
④ 擁有奇數蜀錦的嬪妃,則皇上需補一匹來湊成偶數:
⑤ 判斷每位嬪妃的蜀錦數是否相等:
⑥ 如果每位嬪妃的蜀錦數不相等,則繼續遞歸函數:
⑦ 輸入嬪妃人數和初始的蜀錦數,並存儲及校驗數據:
⑧ 調用遞歸函數:
⑨ 輸出結果,即皇上需補發的蜀錦數:
完整代碼
下面列出此問題的完整Python代碼,以方便你的閱讀與思考。
最後讓我們一起來看看程序的運行效果:
<code>> 請輸入嬪妃人數:4
> 請輸入每人的初始蜀錦數(用逗號隔開):4 8 12 6
> 皇上需要補發10匹蜀錦
/<code>
你們表現都很不錯,朕很滿意。看來你們科技時代的人會編程就是不一樣,等來日朕有空了,等你來給朕講下編程的方法,退下,朕要休息了。