Python チュートリアル - 再帰関数

胡金庫 2023年1月30日
  1. Python 再帰関数とは
  2. 再帰の制限
  3. 再帰の利点
  4. 再帰の欠点
Python チュートリアル - 再帰関数

このセクションでは、Python の再帰関数について学習します。

Python 再帰関数とは

再帰関数はそれ自体を呼び出す関数であり、このプロセスは関数再帰と呼ばれます。

たとえば、数値の階乗を計算してみましょう(例: 6)。

6 * 5 * 4 * 3 * 2 * 1

次のコードでは、数値の階乗を見つける再帰関数が作成されます。

def fact(n):
    """Recursive function to find factorial"""
    if n == 1:
        return 1
    else:
        return n * fact(n - 1)


a = 6
print("Factorial of", a, "=", fact(a))
Factorial of 6 = 720

関数 fact(n) は再帰的な関数です。fact 関数は、数値が 1 になるまで引数 n-1 で自分自身を呼び出します。これが階乗の計算方法です。つまり、数値に 1 より小さい階乗を掛けます。

この再帰関数には、数値が 1 になり、1 が返され、このようにして再帰呼び出しが有限になるという基本条件があります。

再帰関数を作成する場合、その再帰呼び出しを終了するための基本条件が必要です。

再帰の制限

お気づきのように、関数がそれ自体を呼び出すたびに、いくつかの中間値を格納するためのメモリが必要です。したがって、再帰関数は通常の非再帰関数よりも多くのメモリを消費します。Python は再帰呼び出しの制限を 3000 に設定します。

>>> import sys
>>> sys.getrecursionlimit()
3000

再帰が 3000 を超えると、RecursionError が発生します。

def fact(n):
    """Recursive function to find factorial"""
    if n == 1:
        return 1
    else:
        return n * fact(n - 1)


print(fact(4000))
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    print(factorial(4000))
  File "<pyshell#1>", line 5, in factorial
    return n * factorial(n-1)
  File "<pyshell#1>", line 5, in factorial
    return n * factorial(n-1)
  File "<pyshell#1>", line 5, in factorial
    return n * factorial(n-1)
  [Previous line repeated 989 more times]
  File "<pyshell#1>", line 2, in factorial
    if n == 1:
RecursionError: maximum recursion depth exceeded in comparison

再帰制限を削除するソリューション

再帰制限を、必要な再帰よりも大きい数値に設定することで、再帰制限を解決できます。

import sys

sys.setrecursionlimit(5000)


def fact(n):
    """Recursive function to find factorial"""
    if n == 1:
        return 1
    else:
        return n * fact(n - 1)


print(fact(4000))

再帰の利点

  • 再帰関数を使用して、問題をサブ問題に分割し、簡単に解決できます。
  • コードはすっきりときれいになります。

再帰の欠点

  • 再帰関数のロジックをたどることが難しい場合があります。
  • 各サブ問題を解決するには時間がかかるため、再帰関数は非効率的です。
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook