簡単に言えば、再帰は、関数自体を呼び出すことによって問題を解決する方法です。 再帰的 」はラテン語の動詞「 再発 」、つまり何かをやり直すことを意味します。これは再帰関数が行うことであり、同じことを何度もやり直します。つまり、それ自体を呼び出します。この記事では、Pythonでの再帰について学習します。このブログで取り上げられているトピックは次のとおりです。
Pythonの再帰とは何ですか?
再帰は、それ自体の観点から何かを決定するプロセスです。 Pythonでは、どの関数も他の関数を呼び出すことができ、関数はそれ自体を呼び出すこともできます。特定の条件が満たされないまで自分自身を呼び出すこれらのタイプの関数は、再帰関数と呼ばれます。
それがどのように機能するかを確認するためにいくつかの例を見てみましょう。正の整数nが与えられた場合、階乗は次のようになります。
- n! = n *(n-1)*(n-2)など。
- 2! = 2 *(2-1)
- 1! = 1
- 0! = 0
- 4! = 4 * 3!
- 3! = 3 * 2!
- 2! = 2 * 1!
上記の値を置き換えると、次の式になります
- 4! = 4 * 3 * 2 * 1
正の整数または0をパラメーターとして受け取り、n番目の階乗を返すfact(n)などの関数を定義する必要がありますが、再帰を使用してこれを行うにはどうすればよいですか?
見てみましょう。再帰を使用してこれを行うには、次の方程式を調べる必要があります。
n! = n。(n-1)。(n-2)&hellip3.2.1
n! = n。(n-1)! #上記のステートメントをこの行のように書き直すことができます
ここで、パラメーターとして2を渡すと、次のようになります。
2! = 2.1! = 2
最後に、Javaでファイナライズします
同様に、1を渡すと、次のようになります。
1! = 1.0! = 1
しかし、0を渡すと、壊れます
0! = 0。(-1)!ここでは、-1の階乗が定義されていないため、これは0より大きい値に対してのみ機能します。
したがって、2つのケースを作成する必要があります
1. n! = n。(n-1)! n> = 1の場合
2. n = 0の場合は1
これは、すべての正の整数と0に対する完全なソリューションです。
終了条件
再帰関数は、終了するために重要な条件を満たす必要があります。それ以上再帰せずに問題を解決できる状態に移行すると、再帰関数が終了し、問題をより小さなサブステップに最小化します。呼び出しで終了条件が満たされない場合、再帰は無限ループになる可能性があります。
階乗条件:
- nが1より大きい限り、n = n *(n-1)の階乗。
- n = 0の場合は1
上記の階乗条件をPythonコードに変換します。
def fact(n):if n == 1:return n else:return n * fact(n-1)
例を見てみましょう。4の階乗を見つけたいとしましょう。
fact(4)#これは、n == 1になるまで4 * fact(3)などを返します。
出力: 24
単純さと明快さから、再帰の例として頻繁に使用されます。コンピュータサイエンスでは再帰と呼ばれる各ステップで問題の小さなインスタンスを解決します。
Pythonの再帰制限
一部の言語では、無限の再帰ループを作成できますが、Pythonでは再帰制限があります。制限を確認するには、sysモジュールから次の関数を実行します。これにより、Pythonに設定された再帰の制限が与えられます。
Javaクラスローダーのインタビューの質問
import sys sys.getrecursionlimit()
出力: 1000
要件に応じて、sysモジュールのfunctionsetrecursionlimit()を使用して制限を変更することもできます。次に、制限を超えるまで再帰的に呼び出して、何が起こるかを確認する関数を作成しましょう。
def recursive():recursive()if __name__ == '__ main __':recursive()
上記のコードを実行すると、ランタイム例外が発生します:RuntimeError:最大再帰深度を超えました。 Pythonは、終わりのない再帰ループで終わる関数を作成することを防ぎます。
再帰を使用したリストのフラット化
階乗を除いて再帰を使用して実行できるその他のこと。たとえば、ネストされたリストから単一を作成したい場合は、次のコードを使用して実行できます。
def flatten(a_list、flat_list = none):flat_listがnoneの場合:flat_list = [] a_list内のアイテムの場合:if isinstance(item、list):flatten(item、flat_list)else:flat_list.append(item)return flat_list if __name__ == '__ main __':ネスト= [1,2,3、[4,5]、6] x = flatten(nested)print(x)
出力: [1,2,3,4,5,6]
上記のコードを実行すると、入力として使用した整数リストを含む整数リストではなく、単一のリストになります。他の方法を使用して同じことを行うこともできます。Pythonにはitertools.chain()と呼ばれるものがあり、関数chain()の作成に使用されるコードを確認できます。これは、同じことを行うための別のアプローチです。
再帰の利点
コードは、再帰関数でクリーンでエレガントです。
複合タスクは、再帰を使用して、より単純なサブ問題に分解できます。
シーケンスの生成は、ネストされた反復を使用するよりも再帰を使用する方が簡単です。
再帰のデメリット
再帰関数の背後にあるロジックに従うのは難しい場合があります。
再帰呼び出しは、多くのメモリと時間を消費するため、コストがかかります(非効率的です)。
再帰関数はデバッグが困難です。
この記事では、再帰とは何か、問題ステートメントから再帰関数を開発する方法、問題ステートメントを数学的に定義する方法について説明しました。階乗の問題を解決し、その条件をPythonコードに変換して、再帰がどのように機能するかを理解できる階乗を見つけるために必要な条件を見つけました。 Pythonには、開発者が不十分に構築された再帰関数を作成するのを防ぐために、再帰の制限が組み込まれているのは素晴らしいことだと思います。注意すべき重要な点の1つは、関数がそれ自体を呼び出し続けるため、再帰のデバッグが難しいことです。