您的位置:首页 > 其它

递归的应用

2013-02-19 12:27 183 查看
递归是一种编程技术,它利用一个方法调用自身来满足其整个作用

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

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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: