数据结构和算法学习日记——递归

定义

递归就是自己调用自己。

递归必须具备的条件

  • 子问题与原问题解决的是相同的事
  • 不能无限制的调用自身,必须有有效的边界条件可以跳出。

递归调用的底层规则

  • 当程序执行一个方法时,就会在底层开辟一个独立的栈
  • 每个空间的局部变量是独立的,如果是引用变量,则所有空间共用这个引用变量
  • 递归时,当一个方法执行完或者执行return语句时,遵守谁调用返回给谁的原则

递归的迷宫实现

利用二维数组实现一个迷宫地图。在地图上,数字1表示迷宫的墙壁,数字0表示还未走的地方。

在程序执行时,数字2表示已经走过的地方,数字3表示此路走过且此路不通。

/**
 * 迷宫问题
 * 
 * 1 迷宫墙壁,  2 可走且走过的路, 3 走过且不可走的路, 0 未走的路  
 */
public class MazeDemo {

	public static void main(String[] args) {
		
		int[][] maze = creatMaze();
		//printMaze(maze);
		setWay(maze, 1, 1);
		printMaze(maze);

	}
	
	/**
	 * 迷宫的创建
	 */
	public static int[][] creatMaze() {
		
		int[][] maze = new int[8][7];
		
		for(int i = 0; i < 7; i++) {
			maze[0][i] = 1;
			maze[7][i] = 1;
		}
		
		for(int i = 0; i < 8; i++) {
			maze[i][0] = 1;
			maze[i][6] = 1;
		}
		
		maze[3][1] = 1;
		maze[3][2] = 1;
		
		return maze;
	}
	
	/**
	 * 迷宫的打印
	 */
	public static void printMaze(int[][] maze) {
		
		for(int i = 0; i < maze.length; i++) {
			
			for(int j = 0; j< maze[i].length; j++) {
				System.out.printf("%d\t", maze[i][j]);
			}
			System.out.println();
		}
	}
	
	/**
	 * 迷宫查找路径
	 * 从(1,1)到(6,5)
	 * 上——》右——》下——》左
	 */
	public static boolean setWay(int[][] maze, int row, int col) {
		
		if(maze[6][5] == 2) {
			return true;
		} else {
			
			if(maze[row][col] == 0) {
				maze[row][col] = 2;
				if(setWay(maze, row - 1, col)) {
					return true;
				} else if(setWay(maze, row, col + 1)) {
					return true;
				} else if(setWay(maze, row + 1, col)) {
					return true;
				} else if(setWay(maze, row, col - 1)) {
					return true;
				} else {
					maze[row][col] = 3;
					return false;
				}
			} else {
				return false;
			}
		}
	}

}

递归实现八皇后问题

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

/**
 * 8皇后问题 
 */
public class Queen {

	final static int max = 8;
	
	private static int[] arr = new int[max];
	
	private static int count = 0;
	
	public static void main(String[] args) {
		
		check(0);
		System.out.println("共有" + count + "中方法");

	}
	
	/**
	 * 打印一种情况
	 */
	public static void printOne() {
		count++;
		for(int i = 0; i < arr.length; i++) {
			System.out.printf("%d\t", arr[i]);
		}
		System.out.println();
	}

	/**
	 * 判断是否符合第n个皇后是否的条件
	 */
	public static boolean Judge(int n) {
		
		for(int i = 0; i < n; i++) {
			//arr[i] == arr[n] 判断是否处于 同一列
			//Math.abs(n - i) == Math.abs(arr[n] - arr[i]) 判断是否处于同一斜线
			if(arr[i] == arr[n] || Math.abs(n - i) == Math.abs(arr[n] - arr[i])) {
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 获取所有的问题解法
	 */
	public static void check(int n) {
		
		if(n == max) {
			printOne();
			return;
		} else {
			for(int i = 0; i < max; i++) {
				arr[n] = i;
				if(Judge(n)) {
					check(n + 1);
				}
			}
		}		
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章