再帰的アルゴリズムのJava実装(フィボナッチ数列、ハノイの塔、Nクイーン問題)

再帰的アルゴリズムのJava実装(フィボナッチ数列、ハノイの塔、Nクイーン問題)

再帰的定義

数学やコンピュータサイエンスでは、再帰とは関数の定義で関数自体を使用する方法を指します。

再帰の3つの要素

1.再帰的な終了条件を明確にします。

2.再帰が終了したときの処理方法を指定します。

3.反復ロジックを抽出し、問題の規模を縮小します。

フィボナッチ数列

ゴールデンセクションシーケンスとしても知られるフィボナッチ数列(フィボナッチ数列)は、数学者のレオナルドダフィボナッチ(レオナルドダフィボナッチ)がウサギの複製を例に取ったために導入されたため、「ウサギの数列」とも呼ばれます。番号のシーケンス:0、1、1、2、3、5、8、13、21、34、...数学では、フィボナッチ数列は次のように再帰的方法で定義されます:F(0)= 0、F (1)= 1、F(n)= F(n-1)+ F(n-2)(n≥2、n∈N*)

Javaコードの実装

package 递归算法;

public class Fibonacci {
    
    
    public static void main(String[] args) {
    
    
        System.out.println(fib(7));
    }

    /**
     * 
     * @param i 第i个元素
     * @return 返回第i个元素的值
     */
    private static int fib(int i) {
    
    
        if (i == 0 || i == 1){
    
    
            // 终止条件
            return i;
        }
        // 递归条件
        return fib(i - 1) + fib(i - 2);
    }
}


ハノイの塔

伝説によると、古代インドの寺院でハノイと呼ばれるゲームがありました。ゲームは、3本のロッド(A、B、Cの番号)を備えた銅板デバイス上で行われます。Aロッドには、64個の金のプレートが下から上へ、大きいものから小さいものへと順番に配置されます(下図を参照)。ゲームの目的は、ポールAのすべてのゴールドディスクをポールCに移動し、元の順序で積み重ねることです。操作規則:一度に移動できるプレートは1つだけで、移動中は3つのロッドで常に大きなプレートを下に、小さなプレートを上に保ちます。プレートは、ロッドA、B、Cのいずれかに配置できます。操作。

Javaコードの実装

package 递归算法;

public class Hanoi {
    
    
    public static void main(String[] args) {
    
    
        hanoi(3, "A", "B", "C");
    }

    /**
     *
     * @param i 层数
     * @param a 初始盘
     * @param b 借助盘
     * @param c 目标盘
     */
    private static void hanoi(int i, String a, String b, String c) {
    
    
        // 终止条件
        if (i == 1){
    
    
            move(1, a, c);
        }
        else{
    
    
            hanoi(i-1, a, c, b);
            move(i, a, c);
            hanoi(i-1, b, a, c);
        }
    }

    /**
     *
     * @param i 层数
     * @param a 初始盘
     * @param b 目标盘
     */
    private static void move(int i, String a, String b) {
    
    
        System.out.println(a + "-->" + b);
    }
}

Nクイーンの問題

nクイーン問題は、n×nチェス盤にnクイーンを配置し、クイーンが互いに攻撃できないようにする方法を研究します。
エイトクイーン

Javaコードの実装

package 递归算法;

import java.util.Scanner;

// 八皇后问题
public class NQueens {
    
    
    // 皇后个数
    private static int queen;
    // 计数
    private static int count = 0;
    // 定义一个棋盘
    static int[][] map;

    // 构造方法
    public NQueens(int queen){
    
    
        // 初始化皇后
        NQueens.queen = queen;
        // 初始化棋盘
        map = new int[queen][queen];
    }

    /**
     * 八皇后算法
     * @param row 表示行
     */
    public void play(int row){
    
    

        // 遍历当前行的所有单元格
        for(int i = 0; i < queen; i++){
    
    
            if (check(row, i)){
    
    
                map[row][i] = 1;
                if (row == queen-1){
    
    
                    show();
                } else {
    
    
                    play(row+1);
                }

                // 清空棋盘
                map[row][i] = 0;
            }
        }
    }

    /**
     * 显示棋盘的方法
     */
    public void show(){
    
    
        count++;
        System.out.println("第" + count + "种排列方式");
            for(int i = 0; i < queen; i++){
    
    
                for(int j = 0; j < queen; j++){
    
    
                    System.out.print(map[i][j] + " ");
                }
                System.out.println();
        }

    }

    /**
     * 检查是否可以放皇后
     * @param row 行
     * @param col 列
     * @return false不可以, true可以
     */
    private boolean check(int row, int col) {
    
    
        // 判断上面是否有皇后
        for(int i = row - 1; i >= 0; i--){
    
    
            if (map[i][col] == 1){
    
    
                return false;
            }
        }

        // 判左断斜上方是否有皇后
        for(int i = row -1, j = col - 1; i >= 0 && j >=0; i--, j--){
    
    
            if (map[i][j] == 1){
    
    
                return false;
            }
        }

        // 判断右斜上方是否后皇后
        for(int i = row -1, j = col + 1; i >= 0 && j < queen; i--, j++){
    
    
            if (map[i][j] == 1) {
    
    
                return false;
            }
        }
        return true;
    }



    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入皇后个数:");
        int queen = scanner.nextInt();
        NQueens queens = new NQueens(queen);
        queens.play(0);
    }

}

おすすめ

転載: blog.csdn.net/weixin_45017232/article/details/111291418