この記事では、Pythonでの再帰関数の基本的な使い方、それとループとの違い、さらには再帰関数の応用例について解説します。具体的なコード例とその詳細な解説、応用例を含めています。
目次
再帰関数とは
再帰関数とは、自分自身を呼び出す関数のことを指します。一見、無限ループに陥りそうな印象を受けるかもしれませんが、適切な終了条件を設けることで、多くの問題を効率的に解決できます。
基本的な書き方
def factorial(n):
# 終了条件
if n == 0:
return 1
# 再帰処理
return n * factorial(n-1)
この例では、階乗(factorial)を計算するための再帰関数を定義しています。
– `n == 0` が終了条件となります。
– `return n * factorial(n-1)` で関数自体を再帰的に呼び出しています。
ループとの違い
ループ(for文やwhile文)と再帰関数は同じ処理を実行できる場合が多いですが、それぞれには明確な違いがあります。
メモリ使用量
再帰関数はスタックメモリを使用するため、深い再帰になるとスタックオーバーフローのリスクがあります。一方で、ループはスタックメモリをほとんど使用しないので、そのようなリスクは少ないです。
可読性と簡潔性
再帰関数は、問題を自然な形で表現できる場合が多いため、コードが簡潔になりやすいです。しかし、再帰の理解が必要なため、初心者にとっては難解に感じられる場合もあります。
応用例
再帰関数は多くのアルゴリズムで使用されます。以下はその応用例です。
フィボナッチ数列
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
このコードは、フィボナッチ数列のn番目の数を計算します。
リストのフラット化
def flatten(lst):
result = []
for i in lst:
if isinstance(i, list):
result.extend(flatten(i))
else:
result.append(i)
return result
リスト内に他のリストが含まれている場合に、それを一次元のリストに変換します。
二分探索
def binary_search(arr, target):
def _binary_search(arr, target, low, high):
if low > high:
return None
mid = (low + high) // 2
if arr[mid] == target:
return mid
elif arr[mid] < target:
return _binary_search(arr, target, mid+1, high)
else:
return _binary_search(arr, target, low, mid-1)
return _binary_search(arr, target, 0, len(arr) - 1)
このコードは、ソートされた配列内で目的の値を効率よく探します。
まとめ
再帰関数は、特定の種類の問題に非常に適しています。ただし、メモリ使用量や計算時間には注意が必要です。ループとの違いを理解し、適切な場面で再帰関数を使用することが重要です。
コメント