递归
概念:
递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。并且递归用到了虚拟机栈。
应用场景:
-
八皇后问题(注意在不在同一斜线的判断条件)
-
汉诺塔
-
求阶乘
-
迷宫问题
-
球和篮子
各种排序算法
对于一个地图,除了用2维数组表示;也可以用一维数组:a[i] i的值表示第几行,a[i]的值表示第几列
规则:
1、当程序执行到一个方法时,就会创建一个栈帧
2、方法的局部变量是独立的,不会相互影响
3、如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据
4、递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError
5、当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕
代码:八皇后问题
public class Quene {
int possiblity = 0;
int max = 8;
int[] array = new int[max];
public void showValue(){
for(int a : array){
System.out.print(a + " ");
}
System.out.println();
}
public boolean isAllow(int n){
for(int i = 0; i < n; i++){
if(array[n] == array[i] || Math.abs(n-i) == Math.abs(array[n] - array[i])){
return false;
}
}
return true;
}
public void Location(int aRow){
for(int col = 0; col <= 7; col++){
array[aRow] = col;
if(this.isAllow(aRow)){
if(aRow == 7){
this.showValue();
possiblity++;
}else{
Location(aRow + 1);
}
}
}
}
public static void main(String[] args) {
Quene Quene8 = new Quene();
Quene8.Location(0);
System.out.println("there are " + Quene8.possiblity + " possiblity" );
}
}