首先,了解jvm在方法执行时的逻辑。当程序执行到一个方法时,就会开辟一个独立的空间(栈)。
栈中从上往下依次执行完方法。每个空间的局部变量是独立的。
递归需要遵守的重要规则。
1、执行一个方法时,就创建了一个新保护的独立空间(栈)
2、每个栈中的局部变量都是独立的。
3、但是如果方法中使用的是引用类型变量(比如数组),每个栈对其是共享的。
4、递归必须向退出递归的条件逼近,否则就是无限递归,会出现栈溢出,即stackoverflow error。
5、当一个方法执行完毕,或者遇到了return,就会返回,遵守谁调用就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
走迷宫:
import java.util.Arrays;
public class MiGong {
public static void main(String[] args) {
//先创建地图,用二维数组表示。
int[][] map = new int[8][7];
//使用1表示墙。
Arrays.fill(map[0],1);
Arrays.fill(map[7],1);
for (int i = 0; i < 8; i++) {
map[i][0]=1;
map[i][6]=1;
}
map[3][1]=1;
map[3][2]=1;
setway(map, 1, 1);
System.out.println("地图情况");
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 7; j++) {
System.out.print(map[i][j]+" ");
}
System.out.println();
}
}
//使用递归回溯来给小球找路。
//按照下右上左的策略
//0为未走的路,1,3为墙,2为已经走的路。
public static boolean setway(int[][] map,int i ,int j){
if (map[6][5]==2){
return true;
}else {
if (map[i][j]==0){
map[i][j]=2;
if (setway(map, i+1, j)){//下
return true;
}else if (setway(map, i, j+1)){//右
return true;
}else if (setway(map, i-1, j)){//上
return true;
}else if (setway(map, i, j-1)){//左
return true;
}else {
map[i][j]=3;//此路必没有结果
return false;
}
}else {
//该点为1,2,3皆不可继续走。
return false;
}
}
}
}
八皇后问题
import java.util.Arrays;
import java.util.Scanner;
public class Queen8 {
public static int[] location;
static int count =0;
static int maxsize=0;
public static void main(String[] args) {
Scanner scanner =new Scanner(System.in);
maxsize = scanner.nextInt();
location =new int[maxsize];
check(0);
System.out.println("一共有"+count+"种解法");
}
//check 如何放
private static void check(int n){
if (n==maxsize){//最后一行已经放好
print();
count++;
return;
}
for (int i = 0; i < maxsize; i++) {//从第一列行开始放
location[n]=i;
if (judge(n)){
check(n+1);//本行本列可以放,去下一行。
}
}
}
//judge 判断能不能放
private static boolean judge(int n){
for (int i = 0; i < n; i++) {
//与之前放的作比较,同斜线或同列不能放。
if (location[i]==location[n]||Math.abs(i-n)==Math.abs(location[i]-location[n])){
return false;
}
}
return true;
}
//print 打印
private static void print(){
System.out.print(Arrays.toString(location));
System.out.println();
}
}