Java数据结构和算法

数据结构与算法之 递归与回溯算法

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);
    
        }
    
    
    }
上一篇下一篇

猜你喜欢

热点阅读