java之递归

Posted scanner小霸王

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java之递归相关的知识,希望对你有一定的参考价值。

1.分析一段递归代码,了解递归调用流程
在这里插入图片描述
a)当主方法调用test(4)时候,将会进行“套娃”,每个调用方法都会在栈独立开辟一个空间

b)当n =2的时候,不再“套娃”,所以先输出n=2

c)test(2)调用结束,返回test(3),输出n=3,依次反复直到调用层test(4)执行完成
在这里插入图片描述
2.递归常见的类型
a):斐波那契数列
b)猴子吃桃
在这里插入图片描述
在这里插入图片描述

c)老鼠出迷宫(红色为障碍物1,通道为0)
在这里插入图片描述
思路:
ii)先设置障碍物和通道
在这里插入图片描述
ii)核心方法代码分析
第一步:当走到坐标为6,5表示找到出口
第二步:就是还没找到出口,还在寻找当中,寻找要有一个规则(这里定义先 下–》右–》上—》左 分别对象if里面的四个条件;至于为什么最后还有一层else呢,就是可能刚开始就是死路的判断,意味着四处都是墙)
在这里插入图片描述
完整代码:

public class migong {
    public static void main(String[] args) {

        int map[][] = new int[8][7];
        System.out.println(map);
        for(int i =0;i< 7; i++){
            map[0][i] = 1;
            map[7][i] = 1;//设置墙
        }
        for(int i =0;i< 8; i++){
            map[i][0] = 1;
            map[i][6] = 1;//设置墙
        }
        map[3][1] = 1;
        map[3][2] = 1;
        //输出当前地图情况
        System.out.println("输出当前地图情况");
        for(int i =0;i<map.length;i++){
            for(int j =0;j<map[i].length;j++){
                System.out.print(map[i][j]+ " ");
            }
            System.out.println("");
        }
        findway(map,1,1);
        System.out.println("------");
        for(int i =0;i<map.length;i++){
            for(int j =0;j<map[i].length;j++){
                System.out.print(map[i][j]+ " ");
            }
            System.out.println("");
        }

    }
  // 0 表示能走通,1表示障碍物,2表示走过且能走通,3表示走过但是走不通
    public static boolean findway(int[][] map,int i,int j){
        if(map[6][5] ==2)
            return true;
        else {//证明还没找到  下--》右--》上--》左
           if(map[i][j]==0){//0
               map[i][j] = 2;
               //
               if(findway(map,i+1,j)){
                   return true;
               }else if(findway(map,i,j+1)){
                   return true;
               }else if(findway(map,i-1,j)){
                   return true;
               }else if(findway(map,i,j-1)){
                   return true;
               }else {
                   map[i][j] = 3;
                   return false;
               }
           }else {
               return false;
           }


        }
    }
}

运行结果:(2表示一条通道)
在这里插入图片描述

d)汉诺塔
思路:如果有一个盘子直接 从 a–> c;
如果有两个盘子看成多个盘子:
上面所有盘子(看成一个整体)移动到 b,然后把最下面的移到 c
再把 b的所有移到 c

public class hanuota {
    public static void main(String[] args) {
        Tower tower = new Tower();
        tower.move(3,'a','b','c');

    }
}
class Tower{
    public void move(int num,char a,char b,char c){
        if(num == 1){
            System.out.println(a+"-->"+c);
        }else {
            //如果有两个盘子看成多个盘子
            //(先移动)上面所有盘子到 b
            //然后把最下面的移到 c
            //再把 b的所有移到 c
            move(num -1,a,c,b );
            System.out.println(a+"-->"+c);
            move(num-1,b,a,c);
        }
    }
}

e)八皇后
在这里插入图片描述
在这里插入图片描述

public class Queen{

    static final int MAX = 8;
    int qipan[][] = new int[MAX][MAX];
    int k=1;

    public static void main(String[] args) {
        Queen queen = new Queen();
        queen.setqueen(0);
    }

    // 检查棋盘
    boolean cherk(int x, int y) {
        // 检查
        for (int i = 0; i < y; i++) {
            // 检查纵向
            if (qipan[x][i] != 0)
                return false;
            // 检查左斜
            if (x - 1 - i >= 0 && qipan[x - 1 - i][y - 1 - i] != 0)
                return false;
            // 检查右斜
            if (x + 1 + i < MAX && qipan[x + 1 + i][y - 1 - i] != 0)
                return false;
        }
        // 若可以放置则放置
        return true;
    }

    // 递归函数放置皇后
    boolean setqueen(int y) {
        // 行数超过8,则说明找出正确答案
        if (y == MAX)
            return true;
        // 遍历当前行,逐一验证
        for (int i = 0; i < MAX; i++) {
            // 为当前行清零,防止出现脏数据
            for (int x = 0; x < MAX; x++) {
                qipan[x][y] = 0;
            }
            // 检查是否符合规则,符合则进一步递归
            if (cherk(i, y)) {
                qipan[i][y] = 1;
                // 递归如果返回true说明下层找到解决,无需继续循环
                if (setqueen(y + 1)) {
                    System.out.println("第"+ k + "个排列");
                    k++;
                    printqipan();
                    return false;
                }
            }
        }
        return false;
    }

    void printqipan() {
        // 遍历数组输出
        for (int j = 0; j < MAX; j++) {
            for (int i = 0; i < MAX; i++) {
                if (qipan[i][j]!=0) {
                    System.out.print("●");
                }else {
                    System.out.print("□");
                }
            }
            System.out.println();
        }
    }

}

参考文章:https://blog.csdn.net/qq_40176716/article/details/85336869

以上是关于java之递归的主要内容,如果未能解决你的问题,请参考以下文章

48个值得掌握的JavaScript代码片段(上)

Java.nio:最简洁的递归目录删除

JAVA之AOP

java之递归

Java语言基础之方法的设计

Java 基础语法方法的使用