資料構造02:在貴


再帰アルゴリズム


アルゴリズム自体が定義するアルゴリズム
非再帰アルゴリズムと比較

さぎょうげんり


保存された再帰呼び出しに関連する変数の保存/復元
→コンピュータによる自動実行

メリットとデメリット

  • の利点:
  • 複雑な問題を少量のコードで記述しやすい
  • 欠点:コンピュータ性能負担
  • 回帰要素

  • 財務ケース
  • 基本エンクロージャ
  • Alg Factorial(n)
      input integer n
      output factorial of integer n
    1. if(n==1)    {base case}
         return 1
    2. else        {recursion case}
         return n*Factorial(n-1)

    基本ルール


    次のルールを守らないと、再帰的に問題を解決できません.
  • 基本キャビネット:常に灰を吹くことなく解決できる基本キャビネットが必要です.
  • 進行方向:リターンコールは常に基本エンクロージャ
  • に向かう必要がある.
  • が正常に動作すると仮定:すべての再コールが正常に動作すると仮定する
  • 正しく使用:
  • (パフォーマンスが低下する可能性があります)
    ルールを守らないと、次の問題が発生する可能性があります.
  • 不正結果
  • 未停止(無限ループ)
  • ストレージスペースが枯渇
  • ハノイタワー

  • ハノイタワーとは、https://ko.khanacademy.org/computing/computer-science/algorithms/towers-of-hanoi/a/towers-of-hanoi2
  • です.
  • 大いに役に立つ参考資料:https://shoark7.github.io/programming/algorithm/tower-of-hanoi2
  • 次のコードには、ハノイタワーを再帰的に解決する内容が含まれています.
    原版の移出は杭から杭への出力として表現される.
    #include <stdio.h>
    
    void move(int n, char from, char to){
      printf("n=%d\tmove from %c to %c\n", n, from, to);
    }
    
    void hanoi(int n, char from, char aux, char to){
      if(n==1){
        move(n, from, to);
      } else {
        hanoi(n-1, from, to, aux);
        move(n, from, to);
        hanoi(n-1, aux, from, to);
      }
    }
    
    int main(){
      int n;
      scanf("%d", &n);
      hanoi(n, 'A', 'B', 'C');
      return 0;
    }
    上記のプログラムは、hanoi関数を再帰的に呼び出す.
    この関数の再帰的なインスタンスを表示するには、次の手順に従います.
    次のセクション1〜3を再帰的に呼び出すことによって、問題全体を解決する.
    파트1. from말뚝의 위쪽 n-1개를 aux말뚝으로 옮긴다.
    파트2. from말뚝의 가장 아래(가장 큰) 1개를 to말뚝으로 옮긴다.
    파트3. aux말뚝에 있는 n-1개 전부를 to 말뚝으로 옮긴다.
    n=3の場合、出力は以下のようになります.
    n=1 move from A to C	파트1
    n=2 move from A to B	파트1
    n=1 move from C to B 	파트1
    n=3 move from A to C	---파트2
    n=1 move from B to A	------파트3
    n=2 move from B to C	------파트3
    n=1 move from A to C	------파트3