数据结构与算法之 递归与回溯算法
2019-08-22 本文已影响0人
测试员
概念
简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。
递归用于解决什么样的问题
各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题
各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.
将用栈解决的问题-->第归代码比较简洁
递归需要遵守的重要规则
执行一个方法时,就创建一个新的受保护的独立空间(栈空间)
方法的局部变量是独立的,不会相互影响, 比如n变量
如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.
递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:)
当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。
八皇后案例代码实现
package com.yuan.common.recursion;
import java.util.Arrays;
public class Queen8 {
/**
* 初始化棋子🚩数组
*/
private static int count = 1;
private static int max = 8;
private static int[] arr = new int[max];
/**
* 放置棋子,并于第八个结束(从零开始)
*
* @param n
*/
public static void place(int n) {
if (n == 8) {
print();
} else {
//每次放置时,先放到第一列,行则下一行。不行下一列
for (int i = 0; i < 8; i++) {
arr[n] = i;
//没冲突就放下一个旗子
if (!check(n)) {
place(n + 1);
}
//如果冲突就放到下一列
}
}
}
/**
* 检查与之前的n-1个旗子的位置是否有冲突
*
* @param n
*/
public static boolean check(int n) {
for (int i = 0; i < n; i++) {
if (arr[i] == arr[n] || Math.abs(arr[i] - arr[n]) == Math.abs(i - n)) {
return true;
}
}
return false;
}
public static void print() {
System.out.println("第" + count++ + "个正确摆放结果 :" + Arrays.toString(arr));
}
public static void main(String[] args) {
place(0);
}
}