利用python和遞迴實現趕鴨子問題

2021-10-06 19:11:26 字數 2569 閱讀 4362

發現網上沒幾個用python實現這個問題的回答(至少我沒找到,可能是我搜尋功力不行)。所以我就寫出來給大夥瞧瞧,不足之處請多多指教!

乙個人趕著鴨子去每個村莊賣,每經過乙個村子賣去所趕鴨子的一半又乙隻。這樣他經過了七個村子後還剩兩隻鴨子,問他出發時共趕多少只鴨子?經過每個村子賣出多少只鴨子?

要求:

1、使用遞迴

2、程式輸出如下格式:

出發時共趕x只鴨子。

經過第1個村莊賣了y只鴨子,剩餘z只鴨。

經過第2個村莊賣了y』只鴨子,剩餘z』只鴨。

……經過第n個村莊賣了y只鴨子,剩餘z只鴨。

就我個人來看,遞迴還是比較難用的(像我這種人肯定能不用就不用),不過作業嘛,還是要寫的。

據我觀察,遞迴需要兩個東西:

有了上述的概念,我們就來分析題目。利用程式設計求解這類題的思路都是倒著來,最後剩2只鴨子,那麼就賣出去了4只鴨子,那麼到第7個村莊時應該還剩下6只鴨子,以此類推,知道了剩下z只鴨子,那麼剛到這個村子時就有了pre

=2×(

z+1)

pre = 2×(z+1)

pre=2×

(z+1

)只鴨子,賣了pre

−z

pre-z

pre−

z只鴨子。思路有了,遞迴終止條件就出來了,也就是當村莊數等於0的時候,終止遞迴,結束函式。遞迴的內容就是村莊數-1,再加上用剩下的鴨子數目求得的剛到這個村子所擁有的鴨子數目。

思路逐漸清晰,我們需要定義乙個函式,引數為村子數目cunzishu和剩下的鴨子數目duck_num,在遞迴的時候剩下的鴨子數目變為剛到這個村子所擁有的鴨子數目pre,遞迴的終止條件就是

cunzishu == 0。

最後來解決輸出格式的問題。很容易發現,我們的思路是倒著來的,因此得到的關於鴨子的資訊也是倒著來的。因此我的想法是,在函式的引數列表中新增預設值process=』』,來記錄每一次遞迴的資訊,每一次遞迴的資訊加到process前面,並且在前頭加上換行符\n,在將新的process新增到引數中,就可以解決資訊儲存問題。最後在終止條件下加上開頭那句然後輸出process即可。

萬事俱備,來寫**吧!

# 引數為村子數, 剩下的鴨子數和記錄的資訊,預設為空。

def duck(cunzishu, duck_num, process=''):

# 根據剩下的鴨子數目計算剛到這個村時的鴨子數目

pre = 2*(duck_num+1)

# 終止條件

if cunzishu == 0:

process = '出發時共趕{}只鴨子。'.format(duck_num) + process

# 列印最後結果

print(process)

else:

# 賣出的鴨子數目

sell = pre - duck_num

# 記錄資訊

process = '\n經過第{}個村莊賣了{}只鴨子,剩餘{}只鴨。'.format(cunzishu, sell, duck_num) + process

# 遞迴內容(上乙個村子,上乙個村子剩下的鴨子,記錄的資訊)

return duck(cunzishu-1, pre, process)

duck(7,2)

perfect!來看看執行結果:

出發時共趕510只鴨子。

經過第1個村莊賣了256只鴨子,剩餘254只鴨。

經過第2個村莊賣了128只鴨子,剩餘126只鴨。

經過第3個村莊賣了64只鴨子,剩餘62只鴨。

經過第4個村莊賣了32只鴨子,剩餘30只鴨。

經過第5個村莊賣了16只鴨子,剩餘14只鴨。

經過第6個村莊賣了8只鴨子,剩餘6只鴨。

經過第7個村莊賣了4只鴨子,剩餘2只鴨。

這樣就獲得了結果,**的復用性也可以,如果改改引數:

duck(8, 3)
出發時共趕1278只鴨子。

經過第1個村莊賣了640只鴨子,剩餘638只鴨。

經過第2個村莊賣了320只鴨子,剩餘318只鴨。

經過第3個村莊賣了160只鴨子,剩餘158只鴨。

經過第4個村莊賣了80只鴨子,剩餘78只鴨。

經過第5個村莊賣了40只鴨子,剩餘38只鴨。

經過第6個村莊賣了20只鴨子,剩餘18只鴨。

經過第7個村莊賣了10只鴨子,剩餘8只鴨。

經過第8個村莊賣了5只鴨子,剩餘3只鴨。

最後,來乙個毫無意義的環節:

def duck(cunzishu, duck_num, process=''):

return duck(cunzishu-1, 2*(duck_num+1), '\n經過第{}個村莊賣了{}只鴨子,剩餘{}只鴨。'.format(cunzishu, 2*(duck_num+1)-duck_num, duck_num) + process) if cunzishu!=0 else print('出發時共趕{}只鴨子。'.format(duck_num) + process)

Python利用遞迴函式和列表推導式實現快速排序

python 基礎知識 遞迴函式 函式在內部呼叫自身,這個函式就是遞迴函式 計算1 n的整數之和 sum n n 1 n 1 1 1 def fact n if n 1 return 1 return n fact n 1 n 10s fact 10 print r n1 s的整數之和是 s n,s...

Python利用遞迴實現檔案的複製

import os import time from collections import deque 利用遞迴實現目錄的遍歷 para sourcepath 原檔案目錄 para targetpath 目標檔案目錄 def getdirandcopyfile sourcepath,targetpa...

python利用棧實現迷宮(非遞迴)

1 建立迷宮地圖,可以用二維陣列表示,01分別表示牆和路 2 設定迷宮的起點和終點 3 將起點push進儲存路徑的棧。從棧頂元素開始,搜尋其上下左右格仔,如果可達,則將搜尋到的可達的格仔push到當前路徑中 並標記該格仔已經遍歷過 如果乙個格仔周圍的四個格仔均不可走,則將該格仔從路徑中pop 並標記...