Implementação Java do algoritmo recursivo (sequência de Fibonacci, Torre de Hanoi, problema da rainha N)

Implementação Java do algoritmo recursivo (sequência de Fibonacci, Torre de Hanoi, problema da rainha N)

Definição recursiva

Em matemática e ciência da computação, recursão se refere ao método de usar a própria função na definição de uma função.

Três elementos de recursão

1. Esclarecer as condições de rescisão recursiva;

2. Forneça o método de processamento quando a recursão terminar;

3. Extraia a lógica repetitiva e reduza a escala do problema.

Sequência de Fibonacci

A sequência de Fibonacci (sequência de Fibonacci), também conhecida como sequência da seção áurea, foi introduzida porque o matemático Leonardoda Fibonacci (Leonardoda Fibonacci) tomou a reprodução do coelho como exemplo, por isso também é chamada de "Sequência do coelho", referindo-se a Is a sequência de números: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ... Em matemática, a sequência de Fibonacci é definida por um método recursivo da seguinte forma: F (0) = 0, F (1) = 1, F (n) = F (n-1) + F (n-2) (n ≥ 2, n ∈ N *)

implementação de código 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);
    }
}


Torre de Hanói

Segundo a lenda, havia um jogo chamado Hanói no antigo templo indiano. O jogo é em um dispositivo de placa de cobre com três hastes (numeradas A, B, C) Na haste A, 64 placas de ouro são colocadas em ordem de baixo para cima, do grande para o pequeno (como mostra a figura abaixo). O objetivo do jogo: mover todos os discos de ouro do pólo A para o pólo C e empilhá-los na ordem original. Regras de funcionamento: Apenas uma placa pode ser movida de cada vez, e as três hastes sempre mantêm a placa grande para baixo e a placa pequena para cima durante o movimento. A placa pode ser colocada em qualquer uma das hastes A, B e C durante o Operação.

implementação de código 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);
    }
}

Problema de rainha n

O problema das n rainhas estuda como colocar n rainhas em um tabuleiro de xadrez n × n e tornar as rainhas incapazes de atacar umas às outras.
Oito Rainhas

implementação de código 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);
    }

}

Acho que você gosta

Origin blog.csdn.net/weixin_45017232/article/details/111291418
Recomendado
Clasificación