zoukankan      html  css  js  c++  java
  • 递归之打印、阶乘、九九乘法表、迷宫问题

    递归的概念

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

    递归的原则

      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表示该点走不通,本例寻找策略只列举了一种:下->右->上->左查找的策略,程序的运行结果与程序员制定的查找策略有关,我们可以多写几种策略,并通过计数走过的点来找到最短最优的查找方法。

  • 相关阅读:
    2955 ACM 杭电 抢银行 01背包 乘法
    杭店 ACM 1864 最大报销额 01背包
    【ACM】 1231 最大连续子序列
    如何保证消息队列的幂等性
    Kafka如何保证消息的高可用
    消息队列的优点和缺点
    架构学习和经验积累的方法
    如何撰写总体设计与详细设计文档
    如何做合格的面试官
    如何设计好的接口
  • 原文地址:https://www.cnblogs.com/ftx3q/p/15726646.html
Copyright © 2011-2022 走看看