1.什么是递归以及需要遵守的规则
递归就是自己调用自己,但是每一次调用自己的变量会有所改变需要遵守的规则
2. 递归-迷宫问题
代码实现
package com
.qin
.recursion
;
import javax
.swing
.*
;
public class MiGong {
public static void main(String
[] args
) {
int [][] map
= new int[8][7];
for (int i
= 0 ;i
< 7;i
++){
map
[0][i
] = 1;
map
[7][i
] = 1;
}
for (int i
= 0;i
< 8 ; i
++){
map
[i
][0] = 1;
map
[i
][6] = 1;
}
map
[3][1] = 1;
map
[3][2] = 1;
System
.out
.println("地图的效果");
for (int i
= 0;i
<8;i
++){
for (int j
= 0;j
<7;j
++){
System
.out
.printf("%d\t",map
[i
][j
]);
}
System
.out
.println();
}
setWay2(map
,1,1);
System
.out
.println("小球走过的效果");
for (int i
= 0;i
<8;i
++){
for (int j
= 0;j
<7;j
++){
System
.out
.printf("%d\t",map
[i
][j
]);
}
System
.out
.println();
}
}
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 {
return false;
}
}
}
public static boolean setWay2(int[][] map
,int i
,int j
){
if (map
[6][5] == 2 ){
return true;
}else {
if (map
[i
][j
] == 0) {
map
[i
][j
] = 2;
if (setWay2(map
,i
-1,j
)){
return true;
}else if (setWay2(map
,i
,j
+1)){
return true;
}else if (setWay2(map
,i
+1,j
)){
return true;
}else if (setWay2(map
,i
,j
-1)){
return true;
}else {
map
[i
][j
] = 3;
return false;
}
}else {
return false;
}
}
}
}
结果
3.八皇后问题
问题解析 注意事项:如何判断是否在同一行或者同一列
判断在同一列:那就说明数组中有数字是相同的,因为i++ ,所以不可能是同一行,我们只需要判断是否在同一列判断是否在同一斜线上:设一个点位(a,b),设另一个点位(x,y)那么当 |a-x|=|b-y| 相等时说明在同一斜线上
package com
.qin
.recursion
;
public class Queue8 {
int max
= 8;
int [] array
= new int [max
];
static int count
= 0;
public static void main(String
[] args
) {
Queue8 queue8
= new Queue8();
queue8
.check(0);
System
.out
.println("一共有多少种解法:"+count
);
}
private void print(){
count
++;
for (int i
= 0;i
<array
.length
;i
++){
System
.out
.print(array
[i
]+" ");
}
System
.out
.println();
}
private boolean judge(int n
){
for (int i
= 0;i
<n
;i
++){
if (array
[i
] == array
[n
] || Math
.abs(n
-i
)==Math
.abs(array
[n
]-array
[i
])){
return false;
}
}
return true;
}
private void check(int n
){
if (n
==max
){
print();
return;
}
for (int i
= 0; i
< max
; i
++) {
array
[n
] = i
;
if (judge(n
)){
check(n
+1);
}
}
}
}
结果