再帰はプログラミング学習において避けられない重要な概念であり、多くの初心者は最初に接触したときにしばしば混乱します。それでは、再帰とは一体何を意味するのでしょうか?
再帰とは、関数が自分自身を呼び出す方法です。通常、再帰は複雑な問題をより小さなサブ問題に分解し、基準条件(つまり、自分自身を呼び出さずに結果を直接返す)に達するまで続きます。
再帰関数には通常、2 つの主要な部分があります:
1、基準条件:特定の条件が満たされたとき、再帰が停止し、関数は自分自身を呼び出さなくなります。
2、再帰呼び出し:関数が問題を解決する過程で自分自身を呼び出しますが、問題の規模は徐々に縮小します。
再帰の古典的な例は階乗を計算することです。階乗関数は次のように定義されます:
def factorial(n):
if n == 1: # 基準条件:nが1のとき1を返す
return 1
else:
return n * factorial(n - 1) # 再帰呼び出し
次に、生活の例を使って再帰を理解しましょう:
上司が秘書に電話をかけます:
「週末の準備をして!私たちは 2 日間出張します。」
秘書はすぐに夫に電話をかけます:
「親愛なる、私は上司と出張するので、この 2 日間は自分でやってね。」
夫は狡猾な笑みを浮かべ、彼女に電話をかけます:
「ベイビー、妻が出張中だから、私の家に来て、一緒に楽しもう!」
彼女は目を輝かせ、勉強を教えている男の子に急いで知らせます:
「今週末は自由だよ、勉強はキャンセルだ!」
男の子は嬉しそうに跳び上がり、すぐに父親に電話をかけます:
「お父さん、今週末やっと一緒に過ごせるよ!」
上司は息子の言葉を聞いて、すぐに心が和らぎ、電話を取って秘書に言います:
「出張はキャンセルだ、息子と週末を過ごす。」
秘書はため息をつきながら夫に電話をかけます:
「行かない、週末は家にいる。」
夫は焦って、急いで彼女にメッセージを送ります:
「ごめん、妻が出張しなくなった、計画はキャンセルだ!」
彼女は仕方なく男の子に電話をかけます:
「ごめん、勉強は続行だ、早く学費の準備をして。」
男の子は苦い顔をして、父親に電話をかけます:
「ごめんなさいお父さん、やっぱり授業に行かなきゃ…」
上司はため息をつき、黙って携帯電話を取り、再び秘書に電話をかけます:
「はぁ、出張の準備をして…」
この物語を Python で実装します:
def phone_story(state):
characters = [
"上司が秘書に電話をかけて言った:“週末の準備をして、出張します。”",
"秘書が夫に電話をかけて言った:“私は上司と2日間出張するので、自分でやってね。”",
"夫が彼女に電話をかけて言った:“妻が出張中だから、家に来て、一緒に楽しもう!”",
"彼女が自分の勉強を教えている男の子に電話をかけて言った:“今週末は勉強がないよ。”",
"男の子が父親に電話をかけて言った:“お父さん、今週末やっと一緒に過ごせる!”",
"父親(上司)が秘書に電話をかけて言った:“出張はキャンセルだ。息子と週末を過ごす。”",
"秘書が夫に電話をかけて言った:“行かない。”",
"夫が彼女に電話をかけて言った:“ごめん、妻が行かない。”",
"彼女が男の子に電話をかけて言った:“学費を払わなきゃ。”",
"男の子が父親に電話をかけて言った:“ごめんなさいお父さん、授業に行かなきゃ。”"
]
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)