参考文章

    重点把控两个要素:

    • 递归的出口
    • 递归的表达式规律

    关键点

    • 找到问题出口
    • 将当前问题 转换为 一个小的问题,找到规律;在递归中常常是将问题切割成两个部分(1和整体的思想),这能够让我们快速找到递归表达式(规律)

    一般模板

    1. Result M(Problem prob) {
    2. if(problem can be solved easily) {
    3. return <easy solution>;
    4. }
    5. Problem smaller1 = <reduce problem to smaller problem>;
    6. Problem smaller2 = <reduce problem to smaller problem>;
    7. Result finalResult = <combine all results of smaller problem to slove large problem>;
    8. return finalResult;
    9. }

    image.png

    体会一下如何将问题切割成两个部分(1和整体的思想),快速找到递归表达式(规律)

    计算1 + 2 + 3 + …… + 100;sum(n)的问题转换为了sum(n-1) + n

    1. public static void main(String[] args) {
    2. System.out.println("公众号:Java3y:" + sum(100));
    3. }
    4. /**
    5. *
    6. * @param n 要加到的数字,比如题目的100
    7. * @return
    8. */
    9. public static int sum(int n) {
    10. if (n == 1) {
    11. return 1;
    12. } else {
    13. return sum(n - 1) + n;
    14. }
    15. }

    再看个数组相关的递归的一般写法

    1. public static void main(String[] args) {
    2. int[] arrays = {2, 3, 4, 5, 1, 5, 2, 9, 5, 6, 8, 3, 1};
    3. System.out.println("公众号:Java3y:" + findMax(arrays, 0, arrays.length - 1));
    4. }
    5. /**
    6. * 递归,找出数组最大的值
    7. * @param arrays 数组
    8. * @param L 左边界,第一个数
    9. * @param R 右边界,数组的长度
    10. * @return
    11. */
    12. public static int findMax(int[] arrays, int L, int R) {
    13. //如果该数组只有一个数,那么最大的就是该数组第一个值了
    14. if (L == R) {
    15. return arrays[L];
    16. } else {
    17. int a = arrays[L];
    18. int b = findMax(arrays, L + 1, R);//找出整体的最大值
    19. if (a > b) {
    20. return a;
    21. } else {
    22. return b;
    23. }
    24. }
    25. }

    image.png