递归

递归规则:

1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)

2.方法的局部变量是独立的,不会相互影响,

3.如果方法中使用的是引用类型变量(比如数组), 就会共享该引用类型的数据.

4.递归必须向退出递归的条件逼近, 否则就是无限递归,出现 StackOverflowError

5.当一个方法执行完毕, 或者遇到 return, 就会返回, 遵守谁调用, 就将结果返回给谁, 同时当方法执行完毕或者返回时, 该方法也就执行完毕

 

递归解决迷宫问题

public class Maze {
    /**
     * map是二维数组模拟迷宫,i(行),j(列)是迷宫起点;k(行),l(列)是迷宫终点
     * map[i][j]为0表示该点没有走过;1表示墙;2表示通路可以走;3表示该点已经走过,但是走不通
     */
    public static boolean findWay(int[][] map, int i, int j, int k, int l) {
        if (map[k][l] == 2) {// 通路已经找到
            return true;
        } else {
            if (map[i][j] == 0) {//当前这个点还没有走过
                map[i][j] = 2;//先假定该点是可以走通
                //找路策略:下->右->上->左
                if (findWay(map, i + 1, j, k, l)) {
                    return true;
                } else if (findWay(map, i, j + 1, k, l)) {
                    return true;
                } else if (findWay(map, i - 1, j, k, l)) {
                    return true;
                } else if (findWay(map, i, j - 1, k, l)) {
                    return true;
                } else {
                    map[i][j] = 3;//说明该点是走不通,是死路
                    return false;//回退到上一步
                }
            } else {// 如果map[i][j] != 0,可能是1,2,3
                return false;
            }
        }
    }
}

 

递归解决八皇后问题

public class eightQueens {
    
    public static void main(String[] args) {
        eightQueens eightQueens = new eightQueens();
        eightQueens.check(0);
        System.out.printf("一共有%d解法\n", count);
    }

    int max = 8;//定义一个max表示共有多少个皇后
    int[] array = new int[max];//数组:下标+1为行数,元素值+1为列数
    static int count = 0;//记录总共有多少种解法

    private void check(int n) {//n初始传入0,n代表第n+1个皇后
        if (n == max) {//n == 8,8个皇后已经放好
            print();
            return;
        }
        for (int i = 0; i < max; i++) {//依次放入皇后,并判断是否冲突
            array[n] = i;//第n+1个皇后,放到第n+1行的第i+1列
            if (judge(n)) {
                check(n + 1);
            }
            //若冲突,将第n+1个皇后,放在第n+1行第i+2列
        }
    }

    private boolean judge(int n) {
        for (int i = 0; i < n; i++) {//第n个皇后与第1,2······n-1行皇后依次检测是否冲突
            //array[i] == array[n],检测两个皇后是否在同一列
            //Math.abs(n - i) == Math.abs(array[n] - array[i]),检测两个皇后是否在同斜线;行差、列差绝对值相等,即斜率绝对值为1
            if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
                return false;//有冲突
            }
        }
        return true;//无冲突
    }

    private void print() {//输出皇后摆放的位置
        count++;
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
}

 

posted @   半条咸鱼  阅读(18)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示