递归
递归规则:
1.执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
2.方法的局部变量是独立的,不会相互影响,
3.如果方法中使用的是引用类型变量(比如数组), 就会共享该引用类型的数据.
4.递归必须向退出递归的条件逼近, 否则就是无限递归,出现 StackOverflowError
5.当一个方法执行完毕, 或者遇到 return, 就会返回, 遵守谁调用, 就将结果返回给谁, 同时当方法执行完毕或者返回时, 该方法也就执行完毕
递归解决迷宫问题
public class Maze {
/**
* map是二维数组模拟迷宫,i(行),j(列)是迷宫起点;k(行),l(列)是迷宫终点
* map[i][j]为0表示该点没有走过;1表示墙;2表示通路可以走;3表示该点已经走过,但是走不通
*/
public static boolean findWay(int[][] map, int i, int j, int k, int l) {
if (map[k][l] == 2) {// 通路已经找到
return true;
} else {
if (map[i][j] == 0) {//当前这个点还没有走过
map[i][j] = 2;//先假定该点是可以走通
//找路策略:下->右->上->左
if (findWay(map, i + 1, j, k, l)) {
return true;
} else if (findWay(map, i, j + 1, k, l)) {
return true;
} else if (findWay(map, i - 1, j, k, l)) {
return true;
} else if (findWay(map, i, j - 1, k, l)) {
return true;
} else {
map[i][j] = 3;//说明该点是走不通,是死路
return false;//回退到上一步
}
} else {// 如果map[i][j] != 0,可能是1,2,3
return false;
}
}
}
}
递归解决八皇后问题
public class eightQueens {
public static void main(String[] args) {
eightQueens eightQueens = new eightQueens();
eightQueens.check(0);
System.out.printf("一共有%d解法\n", count);
}
int max = 8;//定义一个max表示共有多少个皇后
int[] array = new int[max];//数组:下标+1为行数,元素值+1为列数
static int count = 0;//记录总共有多少种解法
private void check(int n) {//n初始传入0,n代表第n+1个皇后
if (n == max) {//n == 8,8个皇后已经放好
print();
return;
}
for (int i = 0; i < max; i++) {//依次放入皇后,并判断是否冲突
array[n] = i;//第n+1个皇后,放到第n+1行的第i+1列
if (judge(n)) {
check(n + 1);
}
//若冲突,将第n+1个皇后,放在第n+1行第i+2列
}
}
private boolean judge(int n) {
for (int i = 0; i < n; i++) {//第n个皇后与第1,2······n-1行皇后依次检测是否冲突
//array[i] == array[n],检测两个皇后是否在同一列
//Math.abs(n - i) == Math.abs(array[n] - array[i]),检测两个皇后是否在同斜线;行差、列差绝对值相等,即斜率绝对值为1
if (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {
return false;//有冲突
}
}
return true;//无冲突
}
private void print() {//输出皇后摆放的位置
count++;
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战