递归的简单理解:A方法自己调用A方法,也就是说自己调用自己,就是递归。

递归的核心思想:

具体来说就是把复杂的问题,通过层层转化,转为一个与原问题相似的规模较小的问题来解决。

在Java的方法实现上,这种相似的大问题转小问题的解决方式,就产生了自己调用自己的现象。总不能一直把大问题无限分解,总有一个小问题会结束分解,所以递归必须要有明显的结束条件,否则就是无限递归了。

1. 递归的结构必须包括两个部分:

  • 递归头:什么时候不调用自身方法。如果没有递归头,将陷入死循环。也就是说递归头就是终止调用的边界条件。
  • 递归体:调用自身方法用于解决规模较小的与原问题相似的小问题,进一步缩小问题的规模 。

2. 递归示例(自己调用自己):

求阶乘的例子,公式为:factorial(n) = n*factorial(n-1)。当n=0或1时,结果为1,n为负数时,不能求阶乘,代码中要有体现。
package com.zctou.method;

public class Demo06 {
    public static void main(String[] args) {
        // 递归示例
        // 求一个整九的阶乘 5! = 5x4x3x2x1 每次减1
        // 负数不能有阶乘,0和1的阶乘是1
        int i = factorial(0) ;
        System.out.println(i);
    }

    //递归思想,i==1是出口
    public static int factorial(int i) {
        if(i<0) {
            System.out.println("求阶乘不能是负数,请检查~!");
            return -1 ;
        }
        if(i==1 || i==0) {
            return 1 ;
        } else {
            return i*factorial(i-1);
        }
    }
}

3. 递归的基本形式:

从上面求阶乘的例子可以看出,递归的语法结构大致如下:

method(mod) {
    if(endCondition) { //递归头
        end;
    } else {
        method(mod_small) //递归体
    }
}

4.递归的过程

Java方法详解06 - 递归

从上图看,递归,实际上就是一个去与回的过程。Java中,递归的方式是通过堵堆栈来实现的,整个过程实际上就是一个栈的入栈和出栈问题。所以当我们堆栈过多时,很容易就会产生内存溢出问题。

文章目录