遞迴是程式學習中一個不可避免的關鍵概念,很多新手在剛開始接觸時,經常一頭霧水。那麼,遞迴究竟是什麼意思?
遞迴是一種在函數中調用自身的方法。通常遞迴會把一個複雜的問題分解成較小的子問題,直到達到一個基準情況(即不再調用自身,直接返回結果)。
遞迴函數通常有兩個主要部分:
1、基準條件:當滿足某個條件時,遞迴停止,函數不再調用自身。
2、遞迴調用:函數在解決問題的過程中調用自己,但問題的規模逐漸縮小。
遞迴的一個經典例子是計算階乘,階乘函數定義為:
def factorial(n):
if n == 1: # 基準條件:當 n 為 1 時返回 1
return 1
else:
return n * factorial(n - 1) # 遞迴調用
接下來我們換個生活的例子來理解遞迴:
老闆打電話給秘書:
"準備好週末!我們要出差兩天。"
秘書立刻給老公打電話:
"親愛的,我和老闆要出差,你這兩天得自力更生了哈。"
老公露出狡黠的笑容,撥通了女友的電話:
"寶貝,我老婆出差了,來我家吧,咱倆樂呵樂呵!"
女友眼睛一亮,趕緊通知輔導功課的男孩:
"這週末你自由了,功課取消啦!" 男孩高興的跳了起來,馬上給爸爸打電話:
"爸,這個週末終於能跟你一起了!" 老闆聽到兒子的話,瞬間心軟,拿起電話給秘書
說:
"出差取消了,我要陪我兒子過週末。"
秘書一邊嘆氣,一邊給老公打電話:
"不去了,週末在家。"
老公急得不行,趕緊給女友發消息:
“不好意思啊,老婆不出差了,計畫取消!"
女友無奈地打給男孩:
"抱歉了,功課繼續,趕緊準備學費吧。"
男孩一臉苦相,打給爸爸:
"對不起爸,我還是得上課..."
老闆長嘆一聲,默默拿起手機又給秘書打了個電話:
"唉,準備出差吧..."
用 python 來實現以上的故事:
def phone_story(state):
characters = [
"老闆打電話給秘書說:“準備過週末吧,我們要出差了。”",
"秘書打電話給丈夫說:“我和老闆要出差兩天,你要照顧好自己。”",
"丈夫打電話給女友說:“我老婆出差了,回家吧,我們可以玩得開心。”",
"女友給自己輔導功課的男孩打電話:“這個週末不用輔導功課了。”",
"男孩打電話給父親說:“爸爸,我們終於可以一起度過這個週末了。”",
"爸爸(老闆)打電話給秘書說:“出差取消了。我要和我兒子一起過週末。”",
"秘書打電話給丈夫:“我不去了。”",
"丈夫打電話給女友:“對不起,我的妻子不去了。”",
"女朋友打電話給男孩:“你要交學費了。”",
"男孩打電話給他的父親並說:“對不起爸爸,我要上課了。”"
]
print(len(characters))
print(state)
if state == len(characters):
print("爸爸打電話給他的秘書,故事循環回到起點...\n")
return
# 逐層推進
print(characters[state]) # 遞迴調用,模擬每個人逐步傳遞電話
phone_story(state + 1) # 回溯時,角色開始改變決定
print(characters[len(characters) - state - 1])
# 從故事的第一個電話開始
phone_story(0)