用递归解决八皇后问题

什么是递归

递归就是方法自己调用自己, 每次调用时传入不同的变量

递归解决阶乘问题

通过递归的方式解决阶乘问题, 熟悉递归的使用方法

  • Java
public class FactorialDemo {
    public static void main(String[] args) {
        long n = factorial(20);
        System.out.println(n);
    }

    public static long factorial(long number){
        if(number<=1){
            return 1;
        }else {
            return number * factorial(number - 1);
        }
    }
}

输出: 2432902008176640000
  • Javascript
function factorial(num){
    if(num<1){
        return 1;
    }else{
        return num * factorial(num-1);
    }
}
let total = factorial(5);
console.log(total); //120 = 1*2*3*4*5

注意事项
1.执行一个方法时, 就创建了一个受保护的栈空间, 方法的局部变量是独立的, 不会相互影响
2.如果方法中使用的是引用数组类型(比如数组), 就会共享该引用数据类型
3.递归必须向退出递归的条件逼近, 否则就无线递归, 出现StackOverflowError错误

使用递归解决八皇后问题
  • 什么是八皇后问题?
    8乘8的国际象棋上摆放8个皇后, 使其不能相互攻击, 即任意两个皇后都不能处于同一列、同一行或同一斜线上,问有多少种摆法?


    8皇后游戏
  • 思路分析

  1. 第一个皇后先放第一行第一列
  2. 第二个皇后放在第二行第一列, 判断是否可以, 如果不行, 继续尝试第二列、第三例...直到找到合适的
  3. 继续第三个皇后....., 直到第8个皇后也能放在一个不冲突的位置, 算找到一个正确的摆法
  4. 当得到第一个正确解时, 就会开始回溯(这个地方一定要理解), 将第一个皇后放在第一列的所有正确摆法全部得到
  5. 然后继续第一个皇后放在第一行第二列, 后面的步骤跟上面一致
  • 代码实现
    根据上面的思路分析我们应该创建一个二维数组来表示棋盘, 但是我们这里用一个一维数组来表示, 一维数组的的每个元素的下标表示行, 值表示列, 这个能理解不?
public class Q8Demo {

    public static void main(String[] args) {
        Q8 q8 = new Q8();
        q8.check(0);
        System.out.println(q8.count);// 共92种摆法
    }
}

class Q8{
    // 定义共有多少个皇后
    int max = 8;
    // 定义数组array, 保存皇后放置位置的结果
    int[] array = new int[max];
    // 记录一共有多少中摆法
    int count = 0;

    /**
     * 放置皇后
     * 注意: 会有回溯(这个一定要理解)
     * @param n 代表第几个皇后
     */
    public void check(int n){
        // 摆放成功
        if(n == max){
            printResult();
            return;
        }
        // 摆放皇后
        for(int i=0; i

你可能感兴趣的:(用递归解决八皇后问题)