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.
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);
}
}