發現網上沒幾個用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 並標記...