递归调用相关案例
案例1:老鼠出迷宫问题
1 public class MiGong{
2 public static void main (String[] args){
3 int [][] map= new int [8][7];
4 for (int i=0; i<7;i++ ) {
5 map[0][i] = 1;
6 map[7][i] = 1;
7 }
8 for (int i=0;i<7 ;i++ ) {
9 map[i][0] = 1;
10 map[i][6] = 1;
11 }
12 for (int i=0 ;i<map.length ;i++ ) {
13 for (int j= 0;j<map[i].length ;j++ ) {
14 System.out.print(map[i][j]+" ");
15 }
16 map[3][1]=1;
17 map[3][2]=1;
18 System.out.println();
19 }
20 //创建一个find类的对象,是can去调用findway方法调用
21 Find can = new Find();
22 can.findway(map,1,1);
23 // System.out.println(map[i][j]+" ");
24
25 System.out.println("\n通过迷宫路线情况如下:");
26 for(int i=0;i<map.length;i++){
27 for (int j= 0;j<map[i].length ;j++ ) {
28 System.out.print(map[i][j]+" ");
29 }
30 System.out.println();
31 }
32
33 }
34 }
35
36 /*
37 案列:小老鼠出迷宫
38 思路分析:
39 1.先确定迷宫的大小
40 */
41
42
43
44 class Find{
45 /*
46 使用递归回溯的思想来解决老鼠出迷宫
47 1.findway方法就是专门啦找出迷宫的路程
48 2.如果找到,就返回true,否则返回false;
49 3.map二维数组,即表示迷宫
50 4.i,j就是老鼠的位置,初始化位置为(i,j);
51 5.因为我们是递归的找路,所以需要规定map数组的各个值的含义;
52 0表示可以走,1表示障碍物, 2表示可以走,3表示走过,但是走不通是死路
53 6.当map[6][5]=2就说明找到通路,就可以结束,否则就继续找
54 7.先确定老鼠找路策略:下》右》上》左
55 */
56 public boolean findway(int[][] map,int i ,int j){
57 if (map[6][5]==2) {//说明已经找到
58 return true;
59 }else {
60 if (map[i][j]==0) {//当前位置0,说明表可以走
61 //我们假定2可以走通
62 map[i][j] = 2;
63 //使用找路策略,来确定该位置是否真的可以走通
64 if (findway(map,i+1,j)) {//先走下
65 return true;
66 }else if (findway(map,i,j+1)) {//走右
67 return true;
68 }else if (findway(map,i-1,j)) {//走上
69 return true;
70 }else if (findway(map,i,j-1)) {//走左
71 return true;
72 }else {
73 map[i][j]=3;
74 return false;
75 }
76 }else {
77 return false;
78 }
79 }
80
81
82
83 }
84
85
86 }
案例2:汉诺塔:
1 public class tower{
2 public static void main (String[] args){
3
4 Ta can = new Ta();
5 can.move(4,'A','B','C');
6 }
7 }
8
9 class Ta{
10 //num表示移动的个数,a,b,c分别表示A塔,B塔,C塔
11 public void move(int num ,char a,char b, char c){
12 //如只有一个盘 num=1;
13 if (num==1) {
14 System.out.println(a+"->"+c);
15 }else {
16 /*
17 如果有多个盘,可以看成两个,最下面的和最上面的所有盘
18 */
19 //1.先移动上面所有的盘到B,借助c
20 move(num-1,a,c,b);
21 //2.把最下面的这个盘,移动到c
22 System.out.println(a+"->"+c);
23 //3.再把b塔的所有盘,移动到c,借助a
24 move(num-1,b,a,c);
25 }
26 }
27 }
想多了都是问题,做多了才是答案

浙公网安备 33010602011771号