プログラマーのアルゴリズムクラス(3) - 再帰(再帰)アルゴリズム

免責事項:この記事はブロガーオリジナル記事です、続く BY-SAのCC 4.0を 著作権契約、複製、元のソースのリンクと、この文を添付してください。
このリンク: https://blog.csdn.net/m0_37609579/article/details/99772243

まず、再帰的なものです

再帰は、数学的な除算し、自律的な思考です。

  1. 元は小さいと同じ問題に再帰大規模で複雑な問題
  2. 問題を処理します
  3. 境界条件を持つ再帰的必要性、境界条件が満たされない場合は、再帰的に進み、境界条件が満たされたときに、再帰的な停止

[Baiduの百科事典]再帰的に呼ばれるプログラミングのスキル(再帰)自分自身を呼び出すプログラムを。再帰の種類として、アルゴリズムにおけるプログラミング言語広くアプリケーション。プロシージャまたは関数は、直接的または間接的方法自体を呼び出し、通常その定義又は説明に小さな問題を解決するために元の問題と同様層に大規模で複雑な問題であり、唯一の再帰問題解決のプロセスを記述することができる以下のプログラムを必要とする大幅にコードサイズを低減する、計算に必要繰り返されます。

第二に、再帰的な数学的表現

第三に、いくつかの数学の問題の再帰的なソリューション

1.フィボナッチ数

古典的な数学の問題の一つ、フィボナッチ数、また、このような一連を参照して、黄金の列として知られている:1,1,2,3,5,8,13,21、......

ある法律のこのシリーズ、最初の2つの第3項の値、

 
  1.  
    public class Solution {
  2.  
    public int Fibonacci(int n) {
  3.  
    if(n == 0)
  4.  
    return 0;
  5.  
    if(n == 1)
  6.  
    return 1;
  7.  
    return Fibonacci(n-2) + Fibonacci(n-1);
  8.  
    }
  9.  
    }
 

ときnは大きいです、あなたは明らかに再帰の二つの層を使用して、再帰的なアイデアは良いですが、戻りコードが原因である、アルゴリズムはもっとゆっくり実行している感じることができるが、ここでは、反復アルゴリズムを使用することができます大幅に運用効率を向上させ、スペース時間のために。

 
  1.  
    public class Solution {
  2.  
    public int Fibonacci(int n) {
  3.  
    if(n < 2)
  4.  
    return n;
  5.  
    int f = 0, g = 1;
  6.  
    int result = 0;
  7.  
    for(int i = 1; i < n; i++){
  8.  
    result = f + g;
  9.  
    f = g;
  10.  
    g = result;
  11.  
    }
  12.  
    return result;
  13.  
    }
  14.  
    }
 

ハノイの2塔

ハノイの塔は、パズルゲームがインドに起源を、またハノイの塔と呼ばれています。伝説によれば、ブラフマーが作成した3つのキングコラムインド神話、列の大64枚のゴールドディスクに上下小型のスタックから始まりました。大ディスクが小さいディスクの上に配置することができない前記他の列への移動の昇順に梵天コマンドブラーマンこれらのディスクを、。この64ディスクが完全に移動したとき、世界は破壊されます。

AEは诺å¡æ¸¸æ±します

 
  1.  
    public class Hanoilmpl {
  2.  
     
  3.  
    public void hanoi(int n, char A, char B, char C) {
  4.  
    if (n == 1) {
  5.  
    move(A, C);
  6.  
    } else {
  7.  
    hanoi(n - 1, A, C, B);//步骤1 按ACB数序执行N-1的汉诺塔移动
  8.  
    move(A, C); //步骤2 执行最大盘子移动
  9.  
    hanoi(n - 1, B, A, C);//步骤3 按BAC数序执行N-1的汉诺塔移动
  10.  
    }
  11.  
    }
  12.  
     
  13.  
    private void move(char A, char C) {//执行最大盘子的从A-C的移动
  14.  
    System.out.println("move:" + A + "--->" + C);
  15.  
    }
  16.  
     
  17.  
    public static void main(String[] args) {
  18.  
    Hanoilmpl hanoi = new Hanoilmpl();
  19.  
    System.out.println("移动汉诺塔的步骤:");
  20.  
    hanoi.hanoi(3, 'a', 'b', 'c');
  21.  
    }
  22.  
    }
 

3. 8つのクイーン問題

エイトクイーン問題は、古い、よく知られた問題であるアルゴリズムをバックトラックの典型的なケースです。問題はマックスベテルは、1848年に提示した国際チェスプレーヤーです:8つのクイーンズの8×8のグリッドは、それがお互いを攻撃することはできません国際チェスの上に置かれ、つまり、任意の二つの女王は、同じ行にすることはできませんそして、同じ行または同じスラッシュにどのように多くの振り子方法を尋ねました。ガウスは、プログラムの76種類があると思います。1854年にはベルリンで異なるチェス雑誌に異なるソリューションの40種類を発表し、その後、誰かがグラフ理論を使用した結果の92種類を解きます。

8°¡で 8チェス盤8つのクイーン、キンググリッドの各会計、要件が同じ行にクイーンを持つことができない女王の間に互いに「アタック」現象、同じ列または対角線と同じようには見えません。

アルゴリズムの考え方

  1. 初期化:I = 1
  2. 初期化:J = 1
  3. i番目の行から開始し、jは回復の現在値であり、j番目の位置が決定されます

         。女王は、位置jに配置することができます:マーク位置(i、j)は、I ++は、ステップ2に進みます

         。Jの++、転写工程:Bは、位置jクイーンに配置することができません

         C。J> 8、i--は、ステップ3に行くとき

     4.終了:8行目の女王が位置に配置することができます

注:再帰を使用する場合、我々は、[行]をマッピングする必要があり、[i]は空のときチェッカーボード配置を確実に、実行後に0にリセット

 
  1.  
    /**
  2.  
    * 递归算法之八皇后问题
  3.  
    *
  4.  
    * @author Administrator
  5.  
    */
  6.  
    public class Bahuanghou {
  7.  
    //定义一个8*8的矩阵
  8.  
    public static int[][] map = new int[8][8];
  9.  
    public static int count = 1;
  10.  
     
  11.  
    /**
  12.  
    * 显示棋盘方法
  13.  
    */
  14.  
    public static void show() {
  15.  
    System.out.println("第" + count + "中排列方式");
  16.  
    for (int i = 0; i < 8; i++) {
  17.  
    for (int j = 0; j < 8; j++) {
  18.  
    System.out.print(map[i][j] + " ");
  19.  
    }
  20.  
    System.out.println();
  21.  
    }
  22.  
    count++;
  23.  
    }
  24.  
     
  25.  
    /**
  26.  
    * 检验方法(验证该位置是否可以放皇后)
  27.  
    */
  28.  
    public static boolean check(int row, int col) {
  29.  
    //上面(行减小 列不变)
  30.  
    for (int i = row - 1; i >= 0; i--) {
  31.  
    if (map[i][col] == 1) {
  32.  
    return false;
  33.  
    }
  34.  
    }
  35.  
     
  36.  
    //左斜上 (行减小 列减小)
  37.  
    for (int i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
  38.  
     
  39.  
    if (map[i][j] == 1) {
  40.  
    return false;
  41.  
    }
  42.  
     
  43.  
    }
  44.  
    //右斜上 (行减小 列增加)
  45.  
    for (int i = row - 1, j = col + 1; i >= 0 && j < 8; i--, j++) {
  46.  
     
  47.  
    if (map[i][j] == 1) {
  48.  
    return false;
  49.  
    }
  50.  
     
  51.  
    }
  52.  
    return true;
  53.  
    }
  54.  
     
  55.  
    /**
  56.  
    * 八皇后算法
  57.  
    */
  58.  
    public static void play(int row) {
  59.  
     
  60.  
    //遍历当前行的所有单元格
  61.  
    for (int i = 0; i < 8; i++) {
  62.  
    //判断本格是否可以放皇后
  63.  
    if (check(row, i)) {
  64.  
    map[row][i] = 1;
  65.  
    //判断是否为最后一行
  66.  
    if (row == 7) {
  67.  
    show();
  68.  
    } else {
  69.  
    //接着走下一行
  70.  
    play(row + 1);
  71.  
    }
  72.  
     
  73.  
    //取消当前落子 清空棋盘
  74.  
    map[row][i] = 0;
  75.  
    }
  76.  
    }
  77.  
    }
  78.  
     
  79.  
    public static void main(String[] args) {
  80.  
    play(0);
  81.  
    }
  82.  
    }
 

IVの概要

次のように再帰的な思考のために要約することができます。

  • 再帰的プログラミングは「カエル」は最高のアイデアを保持しています。
  • 再帰ことを特徴としている:それは一度だけ小さな問題を解決しよう。

再帰的な実装のために二つのことに従うことができます。

  • 再帰的な輸出条件。
  • 得法は法をまとめています。

私のマイクロチャネル公共数:アーキテクチャの聖書(ID:gentoo666)、共有Java乾燥、並行性の高いプログラミング、人気のある技術的なチュートリアル、および分散型マイクロサービス・テクノロジー、建築、デザイン、ブロック・チェーン・テクノロジー、人工知能、ビッグデータ、Javaのインタビュー質問だけでなく、最先端の情報とそんなに人気があります。ああ毎日更新!

参考文献:

  1. https://blog.csdn.net/qq_41359051/article/details/85276387
  2. https://blog.csdn.net/qq_35256722/article/details/52728739
  3. https://blog.csdn.net/u010183728/article/details/81238401
  4. https://blog.csdn.net/xb2355404/article/details/79144451
  5. https://blog.csdn.net/m0_37618340/article/details/82635031

おすすめ

転載: www.cnblogs.com/anymk/p/11479439.html