递归之打印、阶乘、九九乘法表、迷宫问题

递归的概念

  递归简单的说就是方法自己调用自己,每次调用时传入不同的变量,递归有助程序员解决复杂的问题并使代码更加简洁。

递归的原则

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

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

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

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

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

打印、阶乘、九九乘法表代码

package com.atxihua;

public class RecursionTest {
    public static void main(String[] args) {
        System.out.println("打印");
        test(4);
        System.out.println("阶乘");
        System.out.println(fun(4));
        System.out.println("九九乘法表");
        sf(9);
    }
    public static void test(int n){
        if(n>2){
            test(n-1);
        }
        System.out.println("n="+n);
    }
    public static int fun(int n){
        if(n==1){
            return 1;
        }else {
            return fun(n-1)*n;
        }
    }
    public static void sf(int n){
        if(n==1){
            System.out.println("1*1=1");
        }else {
            sf(n-1);
            for(int i=1;i<=n;i++){
                System.out.print(i+"*"+n+"="+(i*n)+" ");
            }
            System.out.println();
        }
    }
}

运行结果:

 

 迷宫代码

package com.atxihua;

public class MiGong {
    public static void main(String[] args) {
        //先创建一个二维数组,模拟迷宫
        //地图
        int[][]map=new int[8][7];
        //使用1表示墙
        //上下全部置为1
        for(int i=0;i<7;i++){
            map[0][i]=1;
            map[7][i]=1;
        }
        //左右全部置为1
        for(int i=0;i<8;i++){
            map[i][0]=1;
            map[i][6]=1;
        }
        //额外设置2个挡板
        map[3][1]=1;
        map[3][2]=1;
        //查看地图,遍历数组
        System.out.println("查看地图情况");
        for(int i=0;i<8;i++){
            for(int j=0;j<7;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }
        //使用递归回溯给小球找路
        setWay(map,1,1);
        System.out.println("小球走过,并标识过的地图情况");
        for(int i=0;i<8;i++){
            for(int j=0;j<7;j++){
                System.out.print(map[i][j]+" ");
            }
            System.out.println();
        }

    }
/*
* 使用递归回溯来给小球找路
*map表示地图
* i,j表示从地图的哪个位置开始出发(1,1)
* 如果小球能到map[6][5]位置,说明通路找到
* 约定:当map[i][j]为0表示该点没有走过 当为1表示墙;2表示通路;3表示该点已经走过,但走不通
* 走迷宫时,需要确定一个策略:下->右->上->左,如果该点走不通,再回溯
* 如果找到通路,就返回true,否则返回false
* */
    private 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;
                    return false;
                }
            }else {//如果map[i][j]!=0,可能是1,2,3
                return false;
            }
        }
    }

}

运行结果:

 

   使用数组模拟迷宫,1表示墙不可走,走过的点用数字2表示,数字3表示该点走不通,本例寻找策略只列举了一种:下->右->上->左查找的策略,程序的运行结果与程序员制定的查找策略有关,我们可以多写几种策略,并通过计数走过的点来找到最短最优的查找方法。

posted @ 2021-12-24 11:24  活在记忆里的人  阅读(85)  评论(0编辑  收藏  举报