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

概念

简单的说: 递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。

递归用于解决什么样的问题

各种数学问题如: 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);
    
        }
    
    
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容