😽

再帰ってなんなん?

2023/09/30に公開

再帰処理とは

こんにちは、満身創痍のさんまです。
首 ⇒ 腰 ⇒ 肩 (人としてヤバいです・・きてます)
特に、首 ⇒ 腰 は結構きてます。
今回は、再帰について書きたいとおもいます。

再帰って「堅く、難しい、知らん」と思ってる方もいるとおもいますが、結局は先ほど述べた、
「首 ⇒ 腰」 が 「首 ⇔ 腰」になるようなもん!?です。
(ちょっと違うな)

では本格的に

プログラミングにおいて、あるプロシージャの処理内部で再びそのプロシージャ自身を呼び出すような処理を指します。

プログラム内で自身の関数を呼び出すことによって、同じ問題を小さな部分問題に分割し、それを解決するアルゴリズムの手法です。

再帰的なアプローチは、問題が再帰的な性質を持つ場合や、データ構造が再帰的である場合に特に有用です。

関数等のプロシージャ中で自身を呼び出すことで、類似の処理を繰り返すことが可能となります。
再帰処理を行う関数を再帰関数と呼びます。

再帰処理の概要

再帰処理の基本的な概要は次のとおりです

  • 基底ケース(Base Case)
    再帰関数は、ある条件(基底ケース)が満たされた場合に自己呼び出しから抜け出します。
    ※基底ケースがないと、無限ループに陥る可能性があります。
     
  • 再帰ステップ(Recursive Step)
    問題をより小さな部分問題に分割し、再帰関数を呼び出します。
    このとき、問題のサイズが縮小し、最終的に基底ケースに収束します。

メリット、デメリットについて

・・・世の常ですが
やっぱりあるんですよね

メリット

  • 問題を分割しやすく、複雑な問題をシンプルな形に分解できる。
  • 再帰的なアプローチは、数学的な問題やデータ構造の操作に適している。
  • コードが自然で読みやすい場合がある。

デメリット

  • 適切な基底ケースを設定しないと、無限ループに陥る可能性がある。
  • スタックオーバーフローのリスクがある。
  • オーバーヘッドが発生し、非再帰的なアプローチよりもパフォーマンスが低い場合がある。

再帰処理の例

以下は、JavaScriptでの再帰処理の例です。
この例では、階乗を計算する関数を再帰的に実装しています。

階乗を計算する例です
function factorial(n) {
  // 基底ケース
  if (n === 0 || n === 1) {
    return 1;
  }
  // 再帰ステップ
  return n * factorial(n - 1);
}

// 階乗を計算
const result = factorial(5); // 5! = 120
console.log(result);

その他、色々例はあるので、検索して参考にしてみてください。

まとめ

再帰処理は、プログラム内で自己呼び出しを行うアルゴリズムの手法であり、基底ケースと再帰ステップを持つことが特徴です。

メリットとして、問題の分割が容易で、再帰的な性質を持つ問題に適していますが、適切な基底ケースを設定しないと問題が発生する可能性があります。

適切な場面で使用することで、コードのシンプル化や問題解決の効率化になりますが、自分が自分を呼び出すので、なんか背中がだんだん丸まっていく気分になりますよね。 笑

呼びすぎで、マトリョーシカになったような気分になりますよ。
ありがとうございました。(*◕ฺω◕ฺ)ノ

コラボスタイル Developers

Discussion