Python
 Computer >> コンピューター >  >> プログラミング >> Python

Python再帰:ガイド

Python再帰の使用方法

Pythonの再帰は、初心者にとって恐ろしいトピックです。再帰を定義することで、再帰が難しいという神話を払拭しましょう。再帰は、関数がそれ自体を呼び出すプログラミングの方法です。

簡単そうですね。あなたがそれのコツをつかむとき、再帰は難しい概念ではありません。

このPythonチュートリアルでは、再帰とその仕組みについて説明します。このプログラミング方法を開始するのに役立つ階乗関数を使用した再帰の例を見ていきます。

再帰とは何ですか?

再帰とは、それ自体の観点から何かを定義する場所です。

再帰関数は、それ自体を再度呼び出すことによって問題を解決します。この動作は、Pythonなどのほとんどの主要なプログラミング言語でサポートされています。それらは、コンピュータサイエンスとデータサイエンスの重要な部分です。

再帰は、問題をすべて同じ式を使用する小さな問題に分割することで問題の解決策を見つけることができる場合に役立ちます。これらのタイプの問題は、「再帰的アルゴリズム」と呼ばれることがよくあります。それらを解決するための鍵は名前にあります!

反復vs.再帰

アルゴリズムを解決するには、反復的または再帰的に2つの方法があります。

アルゴリズムの反復ソリューションは、「強力だが醜い」と見なされます。彼らは仕事を成し遂げますが、最もエレガントな方法でそれを正確に行うわけではありません。再帰的アルゴリズムを正しく理解するには、反復関数を調べる必要があります。

参加者の81%は、ブートキャンプに参加した後、自分たちの技術的な仕事の見通しについてより自信を持っていると述べました。今日のブートキャンプにマッチしましょう。

平均的なブートキャンプの卒業生は、ブートキャンプの開始から最初の仕事を見つけるまで、キャリアの移行に6か月も費やしませんでした。

反復関数は、ループを使用して問題を解決する関数です。ループが完了するまで、ループ内でコードを実行します。再帰関数は、問題をより小さな部分に分割し、それ自体を呼び出すことによって各部分を解決する関数です。

階乗:反復例

階乗は、再帰と反復思考を示す良い方法です。数学では、階乗は、数値とそれが乗算される前のすべての数値の合計です。

5の階乗は5*4 * 3 * 2*1に等しくなります。2の階乗は2*1に等しくなります。

階乗を計算するために、反復関数を書くことができます:

def factorial(number):
	total = 1
	for n in range(1, number + 1):
		total = total * n
	return total

この関数は、forループを使用して、1の範囲内のすべての数値と、指定した数値に1を加えた数値を反復処理します。反復ごとに、ループが反復処理する数値に合計を掛けます。関数を呼び出して階乗を見つけましょう。

answer = factorial(4)
print(answer)

コードは次のようになります:24。このソリューションに到達するために、コードは次のように実行されます:

  • 1 * 1 =1
  • 2 * 2 =4
  • 4 * 3 =8
  • 8 * 4 =24

ご覧のとおり、コードは4を乗算し、それよりも小さいすべての数値を乗算してから、それ自体を乗算します。

このコードは機能しています。唯一の欠点は、それが可能な限りエレガントではないということです。そこで、再帰関数が役に立ちます。

階乗:再帰の例

階乗を計算する再帰関数を書いてみましょう。新しいPythonファイルを開き、次のコードを貼り付けます。

def factorial(number):
	if number == 1:
		return 1
	else:
		return (number * factorial(number - 1))

このコードは再帰的アプローチを使用しています。この関数を実行すると、「if」ステートメントが実行されます。このステートメントは、関数に渡された数値が1に等しいかどうかをチェックします。等しい場合、関数は1を返します。そうでない場合、数値の階乗が計算されます。

この計算は、関数に渡された数値に前の数値の階乗を掛けることによって機能します。この関数は、「number」が1になるまで何度も呼び出されます。関数が呼び出されるたびに、「number」の値は1ずつ減少します。

コードを4番で試してみましょう。

answer = factorial(4)
print(answer)

回答24が返されます。私たちの答えは正しいです。最後の例と同じです。この問題の解決策は、反復的ではなく再帰的に見つかりました。

まだ少し助けが必要ですか?再帰の別の例を見ていきましょう。

フィボナッチ数列による再帰

フィボナッチ数列は、各数が前の2つの数の合計である数学的列です。このシーケンスは、0、1、1、2、3、5、8、13などで始まります。

このシーケンスは、次の番号を見つけるために2つの番号を追加します。これにより、再帰に最適です。

Pythonファイルを開き、次のコードを貼り付けます。

def fibonacci(number):
	if number <= 1:
		return number
	else:
		return(fibonacci(number - 1) + fibonacci(number - 2))

このコードは、「number」が1より大きい限り、リスト内の先行する2つの数値の合計を計算します。それ以外の場合は「numberが返されます」。それでは、関数を呼び出しましょう。

executions = 5

print("Fibonacci Sequence:")
for number in range(executions):
	print(fibonacci(number))

実行変数は、計算するフィボナッチ数列の数を追跡します。これを使用して、fibonacci()を呼び出すforループを作成します。 1の範囲の各数値と「実行」の値に対して機能します。

forループを開始する前に、「フィボナッチ数列:」をコンソールに出力します。この例では、「for」ループが実行されます。

fibonacci(1)
fibonacci(2)
fibonacci(3)
fibonacci(4)
fibonacci(5)

コードをすべて一緒に実行して、何が起こるか見てみましょう:

Fibonacci Sequence:
0
1
1
2
3

このコードは、フィボナッチ数列の最初の5つの数値を計算します。 「実行」の値を増やすことで、より多くの数値を計算できます。

再帰の深さと基本条件

再帰関数には基本条件が必要です。これは、特定の基本ケースが満たされたときに再帰を停止する条件です。基本関数がないと、無限ループが作成されます。

再帰関数は、デフォルトで1,000回を超えて実行できません。この制限に達すると、次のようなエラーが表示されます。

RecursionError: maximum recursion depth exceeded

フィボナッチプログラムの基本条件は次のとおりです。

...
if number <= 1:
		return number
…

この条件は、フィボナッチプログラム内の「number」の値が1以下であるかどうかをチェックします。等しい場合は、「number」の値が返されます。それ以外の場合は、再帰関数が開始されます。

再帰を使用する必要があるのはなぜですか?

反復関数よりも再帰を使用する利点は何ですか?技術的には、どちらの方法でも同じ結果を得ることができます。再帰の利点は、読みやすくなることです。

再帰関数を見ると、問題の答えはそれをより小さな部分に分解することにあることは明らかです。反復ループの方が速い場合もありますが、読みやすさから再帰関数が通常は好まれます。

再帰関数は読みやすいため、保守とデバッグも簡単です。これは、理解しにくい複雑なアルゴリズムを作成する場合に特に便利です。

結論

再帰関数は、問題の解決策を見つけるために自分自身を呼び出す関数です。

再帰関数は、問題を複数の部分に分割し、反復ごとに問題の1つの部分を解決します。再帰関数は、フィボナッチ数列の階乗と数を計算するために一般的に使用されます。また、多くのアルゴリズムで使用されています。

これで、Pythonで再帰関数を操作する準備が整いました。


  1. Pythonのissubset()関数

    この記事では、Python標準ライブラリで利用可能なissubset()関数の実装と使用法について学習します。 issubset()メソッドは、セットのすべての要素が別のセットに存在する場合(引数として渡される場合)はブール値のTrueを返し、それ以外の場合はブール値のFalseを返します。 下の図では、BはAのサブセットです。AとBが同一のセットである場合、AはBの適切なサブセットであることを意味します。これは、両方のセットに同じ要素が含まれていることを意味します。 構文 <set 1>.issubset(<set 2>) 戻り値 boolean True/

  2. Intersection()関数Python

    この記事では、任意のセットで実行できるintersection()関数について学習します。数学によると、共通部分とは、2つのセットから共通の要素を見つけることを意味します。 構文 <set name>.intersection(<set a1> <set a2> ……..) 戻り値 引数として渡されるセット内の共通要素。 例 set_1 = {'t','u','t','o','r','i','a','l&