java之递归
Posted scanner小霸王
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java之递归相关的知识,希望对你有一定的参考价值。
1.分析一段递归代码,了解递归调用流程
a)当主方法调用test(4)时候,将会进行“套娃”,每个调用方法都会在栈独立开辟一个空间
b)当n =2的时候,不再“套娃”,所以先输出n=2
c)test(2)调用结束,返回test(3),输出n=3,依次反复直到调用层test(4)执行完成
2.递归常见的类型
a):斐波那契数列
b)猴子吃桃
c)老鼠出迷宫(红色为障碍物1,通道为0)
思路:
ii)先设置障碍物和通道
ii)核心方法代码分析
第一步:当走到坐标为6,5表示找到出口
第二步:就是还没找到出口,还在寻找当中,寻找要有一个规则(这里定义先 下–》右–》上—》左 分别对象if里面的四个条件;至于为什么最后还有一层else呢,就是可能刚开始就是死路的判断,意味着四处都是墙)
完整代码:
public class migong {
public static void main(String[] args) {
int map[][] = new int[8][7];
System.out.println(map);
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<map.length;i++){
for(int j =0;j<map[i].length;j++){
System.out.print(map[i][j]+ " ");
}
System.out.println("");
}
findway(map,1,1);
System.out.println("------");
for(int i =0;i<map.length;i++){
for(int j =0;j<map[i].length;j++){
System.out.print(map[i][j]+ " ");
}
System.out.println("");
}
}
// 0 表示能走通,1表示障碍物,2表示走过且能走通,3表示走过但是走不通
public static boolean findway(int[][] map,int i,int j){
if(map[6][5] ==2)
return true;
else {//证明还没找到 下--》右--》上--》左
if(map[i][j]==0){//0
map[i][j] = 2;
//
if(findway(map,i+1,j)){
return true;
}else if(findway(map,i,j+1)){
return true;
}else if(findway(map,i-1,j)){
return true;
}else if(findway(map,i,j-1)){
return true;
}else {
map[i][j] = 3;
return false;
}
}else {
return false;
}
}
}
}
运行结果:(2表示一条通道)
d)汉诺塔
思路:如果有一个盘子直接 从 a–> c;
如果有两个盘子看成多个盘子:
上面所有盘子(看成一个整体)移动到 b,然后把最下面的移到 c
再把 b的所有移到 c
public class hanuota {
public static void main(String[] args) {
Tower tower = new Tower();
tower.move(3,'a','b','c');
}
}
class Tower{
public void move(int num,char a,char b,char c){
if(num == 1){
System.out.println(a+"-->"+c);
}else {
//如果有两个盘子看成多个盘子
//(先移动)上面所有盘子到 b
//然后把最下面的移到 c
//再把 b的所有移到 c
move(num -1,a,c,b );
System.out.println(a+"-->"+c);
move(num-1,b,a,c);
}
}
}
e)八皇后
public class Queen{
static final int MAX = 8;
int qipan[][] = new int[MAX][MAX];
int k=1;
public static void main(String[] args) {
Queen queen = new Queen();
queen.setqueen(0);
}
// 检查棋盘
boolean cherk(int x, int y) {
// 检查
for (int i = 0; i < y; i++) {
// 检查纵向
if (qipan[x][i] != 0)
return false;
// 检查左斜
if (x - 1 - i >= 0 && qipan[x - 1 - i][y - 1 - i] != 0)
return false;
// 检查右斜
if (x + 1 + i < MAX && qipan[x + 1 + i][y - 1 - i] != 0)
return false;
}
// 若可以放置则放置
return true;
}
// 递归函数放置皇后
boolean setqueen(int y) {
// 行数超过8,则说明找出正确答案
if (y == MAX)
return true;
// 遍历当前行,逐一验证
for (int i = 0; i < MAX; i++) {
// 为当前行清零,防止出现脏数据
for (int x = 0; x < MAX; x++) {
qipan[x][y] = 0;
}
// 检查是否符合规则,符合则进一步递归
if (cherk(i, y)) {
qipan[i][y] = 1;
// 递归如果返回true说明下层找到解决,无需继续循环
if (setqueen(y + 1)) {
System.out.println("第"+ k + "个排列");
k++;
printqipan();
return false;
}
}
}
return false;
}
void printqipan() {
// 遍历数组输出
for (int j = 0; j < MAX; j++) {
for (int i = 0; i < MAX; i++) {
if (qipan[i][j]!=0) {
System.out.print("●");
}else {
System.out.print("□");
}
}
System.out.println();
}
}
}
参考文章:https://blog.csdn.net/qq_40176716/article/details/85336869
以上是关于java之递归的主要内容,如果未能解决你的问题,请参考以下文章