递归设计的核心
递归设计的核心在于两点:
- 递归停止条件的判断
- 递归中对于问题的普适情况的解决方案
抓住这两点才能巧妙的解决问题。
递归问题的经典案例:
- 迷宫问题
- 汉诺塔问题
迷宫问题
假设有如下迷宫,其中1代表通路,0代表短路,请找出走出迷宫的道路。
1110110001111
1011101111001
0000101010100
1110111010111
1010000111001
1011111101111
1000000000000
1111111111111
解决问题的思路:
终止条件:
如果所在格子是迷宫的最右下角,且该格子数值为1,那么迷宫走通,递归结束。递归内容
如果所在格子是迷宫的第m行,第n列,则进行如下判断
a. 如果该格子是在迷宫矩阵中,且数值为1,那么我们将齐标记为以判定格子(改写数值为3)
b. 然后分别判断该格子的上下左右相邻格子是否为通路
c. 如果相邻格子中有一个递归判断是通路,则当前格子在走出迷宫的道路上(改写数值为7)
d. 向上层返回对格子是否在通路上的判断
代码展示
Maze.java
package recurrence.maze;
public class Maze {
public static int UNBLOCKED = 1;
public static int TRIED = 3;
public static int PATH = 7;
public static int[][] MAZE = { { 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1 }, { 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 1 },
{ 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0 }, { 1