再帰はプログラミング学習において避けられない重要な概念であり、多くの初心者は最初に接触したときにしばしば混乱します。それでは、再帰とは一体何を意味するのでしょうか?
再帰とは、関数が自分自身を呼び出す方法です。通常、再帰は複雑な問題をより小さなサブ問題に分解し、基準条件(つまり、自分自身を呼び出さずに直接結果を返す)に達するまで続きます。
再帰関数には通常、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)