zoukankan      html  css  js  c++  java
  • 递归简单理解

    递归

    一、递归的概念

    个人理解递归就是方法自己调用自己,每次调用传入不同的变量,递归有助于解决复杂的问题,同时可以让代码变得更简洁

    二、递归的规则

    • 执行一个方法时,就调用一个新的受保护的独立空间(栈空间)
    • 方法的局部变量是独立的,不会相互影响
    • 如果方法中使用的是引用类型变量,就会共享该引用类型的数据
    • 递归必须向退出递归的条件逼近,否则就是无限递归,出现栈溢出
    • 当一个方法执行完毕, 或者遇到 return, 就会返回, 遵守谁调用, 就将结果返回给谁, 同时当方法执行完毕或者返回时, 该方法也就执行完毕

    实例:

    迷宫问题:找出小球从左上角到右下角的路线(底层原理,用二位数组)

    思路分析:

    • 创建一个二位数组模拟迷宫,假设迷宫的大小为8*7,则数组定义为map[8] [7]

    • 用1代表上下左右的边界,0表示暂未走过的线路,2表示已经走过的线路,3表示走过但是一条死路

    • 既然是走迷宫,就不能乱走,因此需要定义一个走的规则,这里是先走下,在走右,在上,在左,即下->右->上->左

    • 球走到终点的条件是球当前的位置为map[6] [5],则找到当前路线

    • 假定球当前从map[1] [1]出发,若按照定义的规则走不通,则进行回溯

    三、代码实现

    package com.atguigu.recursion;
    
    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;
    		}
    		//设置挡板, 1 表示
    		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();
    		}
    	}
    	
    	//使用递归回溯来给小球找路
    	//说明
    	//1. map 表示地图
    	//2. i,j 表示从地图的哪个位置开始出发 (1,1)
    	//3. 如果小球能到 map[6][5] 位置,则说明通路找到.
    	//4. 约定: 当map[i][j] 为 0 表示该点没有走过 当为 1 表示墙  ; 2 表示通路可以走 ; 3 表示该点已经走过,但是走不通
    	//5. 在走迷宫时,需要确定一个策略(方法) 下->右->上->左 , 如果该点走不通,再回溯
    	/**
    	 * 
    	 * @param map 表示地图
    	 * @param i 从哪个位置开始找
    	 * @param j 
    	 * @return 如果找到通路,就返回true, 否则返回false
    	 */
    	public static boolean setWay(int[][] map, int i, int j) {
    		if(map[6][5] == 2) { // 通路已经找到ok
    			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;
    			}
    		}
    	}
    }
    
  • 相关阅读:
    27. Remove Element
    26. Remove Duplicates from Sorted Array
    643. Maximum Average Subarray I
    674. Longest Continuous Increasing Subsequence
    1. Two Sum
    217. Contains Duplicate
    448. Find All Numbers Disappeared in an Array
    566. Reshape the Matrix
    628. Maximum Product of Three Numbers
    UVa 1349 Optimal Bus Route Design (最佳完美匹配)
  • 原文地址:https://www.cnblogs.com/stublog/p/14477153.html
Copyright © 2011-2022 走看看