Pythonでは「関数の中で自分自身を呼び出す」という特殊なテクニックがあります。これは再帰(さいき)関数と呼ばれ、複雑な処理をシンプルに書けるようになる便利な仕組みです。
この記事でわかること
再帰(Recursion)とは?
再帰(recursion)アルゴリズムとは、自分自身の中から自身を呼び出すことで複雑なアルゴリズムを用いたプログラムを明快に記述できるものです。
言い換えると「関数の中でその関数を呼び出す」という動作になります。
具体例:再帰のイメージ
def greet(n):
if n == 0:
return
print(f"こんにちは!あと{n}回")
greet(n - 1)
実行:
greet(3)
結果
こんにちは!あと3回
こんにちは!あと2回
こんにちは!あと1回
関数が自分を「減らしながら」呼び出すことで、ループのように処理が繰り返されています。
再帰の基本構文
def 関数名(引数):
if 終了条件:
return 結果
return 関数名(別の引数) # 自分自身を呼び出す
関数内で任意の位置でその関数自身を呼び出すことが「再帰」となります。よって、関数内にその関数を呼び出すだけです。
再帰はfor構文やif構文と一緒に使用することで任意の回数、条件で呼び出します。
なぜ再帰を使うの?
メリット | 説明 |
---|---|
✅ シンプル | 繰り返し処理を短く書ける |
✅ 構造が自然 | 木構造や数列などに適している |
✅ コードが見やすい | for や while より読みやすくなることも |
ただし、処理が複雑になりすぎるとわかりづらくなるので注意しましょう!
フィボナッチ数列を再帰で求める
フィボナッチ数列とは?
1, 1, 2, 3, 5, 8, 13, …
という風に、「前の2つの数を足して次の数を作る」数列です。
#再帰を用いた使用例
def fib(i):
if i == 1 or i == 2:
return 1
elif i == 0:
pass
else:
return fib(i-1) + fib(i-2)
for i in range(1,11):
print(fib(i))
上記のプログラムは、再帰を用いて「Fibonacci数」を出力するものです。for構文で任意の回数呼び出しています。rangeで1~10まで繰り返しの指定をしていますが、関数内の条件式で「0」の場合も記載しています。これはrangeで未指定の場合だと0始まりなので、指定しなかった場合の回避のため記述しています。
elseでn項に対する「n-1」「n-2」を加えた計算をさせています。
結果
#1
#1
#2
#3
#5
#8
#13
#21
#34
#55
結果として10回目まで計算できていることが確認できました。
応用:フィボナッチ螺旋を描いてみよう!
Pythonの「turtle」ライブラリを使って、フィボナッチのカーブを可視化することもできます。
import turtle
def fibonacci_spiral(n):
a = 0
b = 1
turtle.pendown()
for i in range(n):
c = a + b
a = b
b = c
turtle.forward(c * 5)
turtle.left(90)
turtle.speed(0)
turtle.penup()
turtle.goto(0, 0)
fibonacci_spiral(50)
turtle.done()
結果

補足:再帰 vs 繰り返し(for)
処理 | 違い |
---|---|
再帰 | 関数を自分で呼び出す |
for/while | 明示的にループする |
どちらを使うかは場面によりますが、再帰は「階層構造」「木構造」などで力を発揮します。
まとめ
内容 | ポイント |
---|---|
再帰とは | 関数の中で関数を呼び出す |
書き方 | 終了条件 +再帰呼び出し |
メリット | シンプルで自然な構造が書ける |
注意点 | 無限ループにならないよう終了条件を忘れずに! |