Day2
递归
递归就是方法自己调用自己,每次传入不同的变量,可以理解为俄罗斯套娃。每执行一个方法时会创建一个新的独立空间。递归的过程中要不断得向退出条件靠近,不然就会出现Stack Overflow的问题。
递归问题的应用:
package Recursion;
public class test {
public static void main(String[] args) {
test(5);
int num=name(5);
System.out.println(num);
}
public static void test(int n) {
if (n>1) {
test(n-1);
}else {
System.out.println(n);
}
}
public static int name(int n)
{
if (n==1) {
return 1;
} else {
return name(n-1)*n;
}
}
}
迷宫问题
package Recursion;
public class MIGong {
public static void main(String[] args) {
//先对迷宫进行定义
int maze[][]=new int [8][7];
//对地图进行修改 其中1表示为墙体,0表示为没有走过,2表示已经走过,3表示死路
for (int i = 0; i < 7; i++) {
maze[7][i]=1;
maze[0][i]=1;
}
for (int i = 0; i < 8; i++) {
maze[i][0]=1;
maze[i][6]=1;
}
maze[3][3]=1;
maze[4][4]=1;
maze[5][5]=1;
for (int[] is : maze) {
for (int n : is) {
System.out.print(n+" ");
}
System.out.println();
}
System.out.println();
setway(maze,1,1);
for (int[] is : maze) {
for (int n : is) {
System.out.print(n+" ");
}
System.out.println();
}
int num=0;
for (int[] is : maze) {
for (int n : is) {
if(n==2) {num++;}
}
System.out.println();
}
System.out.println(num);
}
public static boolean setway(int [][]maze,int i,int j) {
if(maze[6][5]==2)
{
return true;
}else {
if (maze[i][j]==0) {
//假定迷宫走的通
maze[i][j]=2;
//向右走
if (setway(maze, i,j+1)) {
return true;
}
//向下走
else if (setway(maze, i+1,j)) {
return true;
}
//向上走
else if (setway(maze, i-1,j)) {
return true;
}
//向下走
else if (setway(maze, i,j-1)) {
return true;
}
else {
maze[i][j]=3;
return false;
}
}
else {
return false;
}
}
}
}
八皇后问题
同样运用的是递归的思想
package Recursion;
import java.util.Scanner;
public class Queen8 {
Scanner in=new Scanner(System.in);
int max=in.nextInt();
int []arr=new int [max];//用一維數組來表示二維棋盤,數組下標表示行數,數組的值表示列。
static int count=0;
public static void main(String[] args) {
Queen8 q=new Queen8();
q.check(0);
System.out.println(count);
}
public void print() {
count++;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
public boolean judge(int n)
{
for (int i = 0; i < n; i++) {
//arr[i]==arr[n] 說明列相等Math.abs(n-i)==Math.abs(arr[n]-arr[i])說明處於同一條斜線上。
if(arr[i]==arr[n] || Math.abs(n-i)==Math.abs(arr[n]-arr[i]) )
{
return false;
}
}
return true;
}
public void check(int n) {
if(n==max)
{
print();
return;
}
for (int i = 0; i < max; i++) {
arr[n]=i;
if(judge(n))
{
check(n+1);
}
}
}
}