递归算法java实现(斐波那契数列、汉诺塔、N皇后问题)

递归算法java实现(斐波那契数列、汉诺塔、N皇后问题)

递归定义

在数学与计算机科学中,递归(Recursion)是指在函数的定义中使用函数自身的方法。

递归三个要素

1、明确递归终止条件;

2、给出递归终止时的处理办法;

3、提取重复的逻辑,缩小问题规模。

斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列: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);
    }
}


汉诺塔问题

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于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);
    }

}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值