递归的应用

递归是一种编程技术,它利用一个方法调用自身来满足其整个作用

以下介绍两个递归的应用:

1.穿越迷宫(在栈的实现与应用中已经用栈实现了,这里使用递归进行实现)

package xidian.sl.sortingandsearching;

public class Maze2 {
    //表示移动有效,网格方块会从1变成3
    private final int TRIED = 3;
    private final int PATH = 7;
    //用二维数组来模拟迷宫,1表示路径畅通,0表示路径不同
    private int[][] grid = {{1,1,1,0,1,1,0,0,0,1,1,1,1},
                            {1,0,1,1,1,0,1,1,1,1,0,1,1},
                            {0,0,0,0,1,0,1,0,1,0,1,0,0},
                            {1,1,1,0,1,1,1,0,1,0,1,1,1},
                            {1,0,1,0,0,0,0,1,1,1,0,0,1},
                            {1,0,1,1,1,1,1,1,0,1,1,1,1},
                            {1,0,0,0,0,0,0,0,0,0,0,0,0},
                            {1,1,1,1,1,1,1,1,1,1,1,1,1}    };
    
    public boolean traverse(int row, int column){
        boolean done = false;
        
        if(valid(row, column)){
            //标志该位置有效
            grid[row][column] = TRIED;
            //判定是否已经到达右下角,即走出迷宫
            if(row == grid.length-1 && column == grid[0].length-1){
                done = true;
            }else{
                //向下走
                done = traverse(row + 1, column);                //down
                if(!done){
                    //向右走
                    done = traverse(row, column + 1);            //right
                }
                if(!done){
                    //向上走
                    done = traverse(row - 1, column);            //up
                }
                if(!done){
                    //向左走
                    done = traverse(row, column - 1);            //left
                }
            }
            if(done){
                grid[row][column] = PATH;
            }
        }
        return done;
    }
    //用于判断指定行/列的移动是否有效,当移动仍然处于网格内并且指定位置处存放着1,则认为此次移动有效,返回true
    private boolean valid(int row, int column){
        boolean result = false;
        
        if(row >= 0 && row < grid.length && column >= 0 && column < grid[row].length){
            if(grid[row][column] == 1){
                result = true;
            }
        }
        return result;
    }
    //重写toString方法
    public String toString(){
        String result = "\n";
        for(int row = 0; row < grid.length; row++){
            for(int column = 0; column < grid[row].length; column++){
                result += grid[row][column] + "";
            }
            result += "\n";
        }
        return result;
    }
}

测试类:

package xidian.sl.sortingandsearching;

/**
 * 递归解决穿越迷宫问题
 * */
public class MazeSearch {
    public static void main(String[] args) {
        Maze2 labyrinth = new Maze2();
        System.out.println(labyrinth);
        
        if(labyrinth.traverse(0, 0)){
            System.out.println("成功穿越");
        }else{
            System.out.println("没有可能穿越的路");
        }
        
        System.out.println(labyrinth);
    }
}

 

2.大家肯定玩过的游戏(汉诺塔)

package xidian.sl.sortingandsearching;

public class TowersOfHanoi {
    //记录汉诺塔总共多少张圆盘
    private int totalDisks;
    
    public TowersOfHanoi(int disks){
        totalDisks = disks;
    }
    
    public void slove(){
        moveTower(totalDisks, 1, 3, 2);
    }
    
    private void moveTower(int numDisks, int start, int end, int temp){
        if(numDisks == 1){
            moveOneDisk(start, end);
        }else{
            moveTower(numDisks - 1, start, temp, end);
            moveOneDisk(start, end);
            moveTower(numDisks - 1, temp, end, start);
        }
    }
    
    private void moveOneDisk(int start, int end){
        System.out.println("移动一张盘子,从 "+start+" 到"+end);
    }
}

测试类:

package xidian.sl.sortingandsearching;

public class SolveTowers {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TowersOfHanoi towers = new TowersOfHanoi(4);
        towers.slove();
    }

}

 

 

 

posted on 2013-02-19 12:27  发表是最好的记忆  阅读(1249)  评论(0编辑  收藏  举报