再帰とは何ですか?再帰は、それ自体の観点から何かを定義するプロセスです。
物理的な世界の例は、互いに対向する二つの平行ミラーを配置することです。 それらの間にあるオブジェクトは再帰的に反映されます。
Pythonの再帰関数
Pythonでは、関数が他の関数を呼び出すことができることを知っています。 関数が自分自身を呼び出すことさえ可能です。 これらのタイプの構造は再帰関数と呼ばれます。次の画像は、recurse
という再帰関数の動作を示しています。P>
以下は、整数の階乗を見つけるための再帰関数の例です。数の階乗は、1からその数までのすべての整数の積です。
数の階乗は、1からその数までのすべての整数の積です。
例えば、6の階乗(6と表記されます!)は1*2*3*4*5*6 = 720.
再帰関数の例
def factorial(x): """This is a recursive function to find the factorial of an integer""" if x == 1: return 1 else: return (x * factorial(x-1))num = 3print("The factorial of", num, "is", factorial(num))
出力
The factorial of 3 is 6
上記の例では、factorial()
は再帰関数です。p>
この関数を正の整数で呼び出すと、数を減らすことによって再帰的に呼び出します。
各関数は、1に等しくなるまで、その下の数の階乗で数を乗算します。 この再帰呼び出しは、次の手順で説明できます。
factorial(3) # 1st call with 33 * factorial(2) # 2nd call with 23 * 2 * factorial(1) # 3rd call with 13 * 2 * 1 # return from 3rd call as number=13 * 2 # return from 2nd call6 # return from 1st call
何が起こっているかのステップバイステップのプロセスを示す画像を見てみましょう:
数が1に減少すると再帰が終了します。 これは基本条件と呼ばれます。
すべての再帰関数は、再帰を停止する基本条件を持たなければならず、そうでなければ関数自体が無限に呼び出されます。
Pythonインタプリタは、無限の再帰を避けるために再帰の深さを制限し、スタックオーバーフローを引き起こします。
デフォルトでは、再帰の最大深度は1000です。 制限を超えると、RecursionError
になります。 そのような条件の1つを見てみましょう。
def recursor(): recursor()recursor()
出力
Traceback (most recent call last): File "<string>", line 3, in <module> File "<string>", line 2, in a File "<string>", line 2, in a File "<string>", line 2, in a RecursionError: maximum recursion depth exceeded
再帰の利点
- 再帰関数は、コードがきれいでエレガントに見えるようにします。
- 複雑なタスクは、再帰を使用してより単純なサブ問題に分解することができます。
- シーケンスの生成は、ネストされた反復を使用するよりも再帰で簡単です。
再帰の欠点
- 再帰の背後にあるロジックがフォロースルーするのが難しいことがあります。
- 再帰呼び出しは、多くのメモリと時間を消費するため、高価です(非効率的です)。
- 再帰関数はデバッグが困難です。