Day560.递归 -数据结构和算法Java

Posted 阿昌喜欢吃黄桃

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Day560.递归 -数据结构和算法Java相关的知识,希望对你有一定的参考价值。

递归

一、递归应用场景举例


二、递归基本概述


三、递归的调用机制


四、使用时注意的规则


五、递归问题

1、迷宫问题

package com.achang.recursion;

/**
 * @Author Achang
 * @Date 2022/3/15 21:22
 * 递归---迷宫问题
 **/
public class MiGong 
    public static void main(String[] args) 
        int[][] map = initMap();

        for (int i = 0; i < map.length; i++) 
            for (int j = 0; j < 7; j++) 
                System.out.print(map[i][j] + "");
            
            System.out.println();
        
        System.out.println("===========");
        setWay(map,1,1);
        System.out.println("==========");

        for (int i = 0; i < map.length; i++) 
            for (int j = 0; j < 7; j++) 
                System.out.print(map[i][j] + "");
            
            System.out.println();
        



    

    /**
     *
     * @param map 需要查找的地图
     * @param i 行坐标
     * @param j 列坐标
     * @return 如果找到路返回T,反之为F
     * 使用递归回溯,给小球找路
     * 1、map表示地图
     * 2、i,j表示从地图哪个位置触发(1,1)
     * 3、如果小球能找到map[6][5]的位置,表示有通路
     * 4、当map[i][j]为0时,表示还没走过该路,当为1时,为墙;为2时,表示通路可以走;为3时,表示该位置已经走了,但走不通
     * 5、在走迷宫时,需要确定一个“策略”,下--->右--->上--->左,通过该点走不通,再回溯
     */
    public static boolean setWay(int[][] map,int i,int j)
        if (map[6][5] == 2)//通路已经找到了
            return true;
        else 
            if (map[i][j] == 0)//如果当前还没有走过
                //策略:下--->右--->上--->左
                map[i][j] = 2;//假定该点可以走通
                if (setWay(map,i+1,j))//向下走
                    return true;
                else if (setWay(map,i,j+1)) //向右走
                    return true;
                else if (setWay(map,i-1,j))//向上走
                    return true;
                else if (setWay(map,i,j-1))//向左走
                    return true;
                else 
                    //说明该点是死路
                    map[i][j] = 3;
                
            else //如果map[i][j]不等于0,可能是 1/2/3
                return false;
            
        
        return false;
    

    //初始化一个案例的map迷宫
    private static int[][] initMap() 
        int[][] map = new int[8][7];//通过二维数组模拟迷宫
        //1表示墙
        //上下全部置为1
        for (int i = 0; i < 7; i++) 
            //将上下行,全部置为1;
            map[0][i] = 1;
            map[7][i] = 1;
        
        for (int i = 0; i < 8; i++) 
            //将左右列,全部置为1;
            map[i][0] = 1;
            map[i][6] = 1;
        
        //设置挡板
        map[3][1] = 1;
        map[3][2] = 1;
        return map;
    


2、八皇后问题

  • 介绍

  • 思路分析

  • 示意图

  • 代码实现

/**
 * @Author Achang
 * @Date 2022/3/17 21:18
 * 八皇后问题
 **/
public class Queue8 

    //主入口测试
    public static void main(String[] args) 
        Queue8 queue8 = new Queue8();
        queue8.check(0);
        System.out.println("一共print()了 "+count+" 次");
    


    //定义一个max,表示共有多少个皇后
    int max = 8;
    //保存皇后放置位置的结果
    int[] arr = new int[max];
    //打印次数计数器
    static int count;

    //放置第n个皇后
    //check是每一次递归,进入到check中都有for循环一次,因此会有回溯
    public  void check(int n)
        //n = 8,表示在放第9个皇后,表示已经不需要再放了,前8个已经放好了
        if (n == max)
            print();
            return;
        
        //没有结束的情况
        //依次放入皇后,并判断是否冲突
        for (int i = 0; i < max; i++) 
            //先帮当前这个皇后n,放到该行的第一列中
            arr[n] = i;
            //判断是否有冲突
            if (judge(n))//不冲突
                check(n+1);//接着放n+1个皇后,开始递归
            
            //冲突
            //就继续执行 arr[n] = i;即将第n个皇后,放置在本行的后一个位置
        
    

    /**
     * 查看当我们放置第n个皇后,就去检测该皇后是否和前面已经摆放的皇后冲突(同行/同斜/同列)
     * @param n 表示第n个皇后
     */
    public boolean judge(int n)
        for (int i = 0; i < n; i++) 
            //说明他们在同一列 || 同斜(斜率相同)
            if (arr[i] == arr[n] || Math.abs(n-i) == Math.abs(arr[n]-arr[i]))
                return false;
            
        
        return true;
    


    //可以将皇后摆放的位置打印出来
    public void print()
        for (int item : arr) 
            System.out.print(item+"");
        
        System.out.println();
        count++;
    



以上是关于Day560.递归 -数据结构和算法Java的主要内容,如果未能解决你的问题,请参考以下文章

day16 -- 递归函数,二分查找

day10_控制文件

函数递归+匿名函数+内置函数day15

day_06递归二分查找

day16 初始递归

递归字节流文件复制_DAY20