挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

宮裡新晉了十幾名嬪妃,皇上說,“朕有一批上好的蜀錦料子,想要分於各位,朕今日心情大好,倒不如一起來玩個遊戲!”。


皇上繼續說道,“遊戲規則是這樣的:有n名嬪妃圍坐成一圈,朕給每位嬪妃都隨機分發偶數匹蜀錦,然後開始遊戲,遊戲中每位嬪妃都需要把自己蜀錦的一半分給左側的嬪妃。一輪遊戲後,擁有奇數匹蜀錦的嬪妃朕會再補給一匹蜀錦,從而變成偶數。反覆進行這個遊戲,直到各位嬪妃手上的蜀錦數量相同為止”。


此時,皇上在思考:在已知初始蜀錦數的情況下,朕一共需要補發多少匹蜀錦呢?

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

皇上分蜀錦

問題整理

我們來幫助皇上解決這個疑惑,根據故事情節,題目要求如下:

要求:

<code>輸入:
① 程序首先讀入一個整數n(2/<code>

樣例:

<code>輸入:

> 請輸入嬪妃人數:3

> 請輸入每人的初始蜀錦數(用空格隔開):2 2 4

輸出:

> 皇上需要補發4匹蜀錦

/<code>

思路分析

我們可以看出該問題屬於遞歸類問題,因此我們需要定義遞歸函數來解決這個問題。

我們把每位嬪妃的蜀錦數定義在列表變量list中,然後構造一個遞歸函數shareCloths(n,list),其中n為嬪妃標識,list表示每位嬪妃手上的蜀錦數。我們把每位嬪妃蜀錦數的一半也記錄在一個新的列表變量halfList中,當然list和halfList這兩個列表中每位嬪妃的順序是一致的。

好了,接下來就是分配蜀錦的過程了,每位嬪妃把自己蜀錦的一半都給左側的人,分完一輪之後再依次判斷每人手上的蜀錦數是否為奇數,如果是,則皇上應補一匹,程序中別忘記記錄補發的蜀錦數喔!

程序最後,我們再來判斷每位嬪妃的蜀錦數是否相等,如果相等則可求得皇上需補發的蜀錦數,如果不相等則繼續遞歸函數。

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

遞歸函數演示

分析到這裡,我相信很多朋友已經開始著手嘗試編寫代碼了。如果你還沒有代碼編寫思路,沒關係,跟著我一起來看看如何用Python代碼實現它,出發!

代碼實現

① 定義全局變量,並定義遞歸函數shareCloths(n,list):

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

定義遞歸函數

② 用列表halfList來記錄當前每位嬪妃蜀錦數的1/2:

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

記錄數量

③ 每位嬪妃把自己蜀錦的1/2分給左側的嬪妃:

注意:最後一位嬪妃的蜀錦數 = 第一位嬪妃上一輪的蜀錦數的1/2 + 最後一位嬪妃的蜀錦數的1/2

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

記錄數量

④ 擁有奇數蜀錦的嬪妃,則皇上需補一匹來湊成偶數:

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

奇數判斷

⑤ 判斷每位嬪妃的蜀錦數是否相等:

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

判斷是否相等

⑥ 如果每位嬪妃的蜀錦數不相等,則繼續遞歸函數:

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

遞歸函數

⑦ 輸入嬪妃人數和初始的蜀錦數,並存儲及校驗數據:

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

輸入與校驗

⑧ 調用遞歸函數:

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

調用函數

⑨ 輸出結果,即皇上需補發的蜀錦數:

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

輸出結果

完整代碼

下面列出此問題的完整Python代碼,以方便你的閱讀與思考。

挑戰下《甄嬛傳》中嬪妃蜀錦的算法問題?附錄Python參考代碼

完整代碼

最後讓我們一起來看看程序的運行效果:

<code>

> 請輸入嬪妃人數:4

> 請輸入每人的初始蜀錦數(用逗號隔開):4 8 12 6

> 皇上需要補發10匹蜀錦

/<code>

你們表現都很不錯,朕很滿意。看來你們科技時代的人會編程就是不一樣,等來日朕有空了,等你來給朕講下編程的方法,退下,朕要休息了。


分享到:


相關文章: