递归简单案例:迷宫问题与八皇后问题
本文最后更新于:2 年前
关于递归(Recursion)
调递归就是方法自己调用自己,每次调用时传入不同的变量。递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。
- 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题( google 编程大赛)
- 各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等
- 用栈解决的问题——–>用递归代码比较简洁
递归调用机制
递归调用规则
执行一个方法时,就创建一个新的受保护的独立空间(栈空间)。
方法的局部变量是独立的,不会相互影响, 比如 n 变量。
如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据。
递归必须向退出递归的条件逼近,否则就是无限递归,出现 StackOverflowError 错误,死龟了。
当一个方法执行完毕,或者遇到 return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
迷宫问题
思路分析
代码实现
1 |
|
八皇后问题
思路分析
放置顺序
第一个皇后先放第一行第一列;
第二个皇后放在第二行第一列,然后判断是否OK。
如果不OK,继续放在第二列、第三列…依次把所有列都放完,找到一个合适位置;
继续第三个皇后,还是第一列、第二列……直到第 8 个皇后也能放在一个不冲突的位置,算是找到了一个正确解;
当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解,全部得到;
然后回头继续第一个皇后放第二列,后面继续循环执行 1,2,3,4 的步骤 。
说明:理论上应该创建一个二维数组来表示棋盘,但是实际上可以通过算法,用一个一维数组即可解决问题。
arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3}
arr 下标表示第几行,即第几个皇后;
arr[i] 的值表示皇后在该行的位置。
arr[i] = val :表示第 i+1 个皇后,放在第 i+1行 的第 val+1列。
位置判断
array[i] == array[n]
表示判断第 n 个皇后是否和前面的 n-1个皇后在同一列
Math.abs(n-i) == Math.abs(array[n] - array[i])
表示判断第 n 个皇后是否和第 i 个皇后在同一斜线上。
如第二个皇后放 n=1位置,即二行二列位置,此时:n=1, array[1] = 1:
1
2Math.abs(1-0) == 1
Math.abs(array[n] - array[i]) = Math.abs(1-0) = 1此时该位置在同一斜线上,所以不合适。
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
- 没有必要判断是否在同一行,因为摆放时 n 每次都在递增
代码实现
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!