Java 递归

介绍

递归:指在当前方法内调用自己的这种现象。

递归的分类

递归分为两种:

  • 直接递归:称为方法自身调用自己。
  • 间接递归:方法之间调用,如:A方法调用B方法,B方法调用C方法,C方法调用A方法。

简单例子

void test(){
    System.out.println(1);
    // 方法递归,自己调用自己
    test();
}

注意: 递归有次数限制的,不能太多,否则会报错

例子:递归次数

int i = 1;
void test2(){
    i++;
    System.out.println(i);
    // 方法递归,自己调用自己,是有次数限制的,不能太多,否则会报错
    test2();
}

结论:递归1万多次就会报错

注意事项

  • 递归一定要有 条件限制,保证递归能够 停止下来,否则会发生栈内存溢出。
  • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
  • 构造方法,禁止递归
public class Demo01DiGui {
    public static void main(String[] args) {
        // a();
        b(1);
    }

    /*
     * 3.构造方法,禁止递归
     * 编译报错:构造方法是创建对象使用的,不能让对象一直创建下去
     */
    public Demo01DiGui() {
        //Demo01DiGui();
    }


    /*
     * 2.在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
     * 4993
     *     Exception in thread "main" java.lang.StackOverflowError
     */
    private static void b(int i) {
        System.out.println(i);
        //添加一个递归结束的条件,i==5000的时候结束
        if(i==5000){
            return;//结束方法
        }
        b(++i);
    }

    /*
     * 1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main"
     * java.lang.StackOverflowError
     */
    private static void a() {
        System.out.println("a方法");
        a();
    }
}

递归累加求和

计算1 ~ n的和

分析:num的累和 = num + (num-1)的累和,所以可以把累和的操作定义成一个方法,递归调用。

实现代码:

public static void main(String[] args) {
    // 创建对象,没给对象起名,匿名对象
    //计算1~num的和,使用递归完成
    // 调用求和的方法
    int sum = new Std50_递归().add(5);
    // 输出结果
    System.out.println("sum = "+ sum);
}

int add( int i){
    /*
       num为1时,方法返回1,
       相当于是方法的出口,num总有是1的情况
    */
    if( i == 1){
        return 1;
    }
    /*
      num不为1时,方法返回 num +(num-1)的累和
      递归调用getSum方法
    */
    return i + add(i-1);
}

图解:

递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。

递归求阶乘

阶乘:所有小于及等于该数的正整数的积。

n的阶乘:n! = n * (n-1) *...* 3 * 2 * 1

分析:这与累和类似,只不过换成了乘法运算,学员可以自己练习,需要注意阶乘值符合int类型的范围。

推理得出:n! = n * (n-1)!

代码实现:

public class DiGuiDemo {
      //计算n的阶乘,使用递归完成
    public static void main(String[] args) {
        int n = 3;
          // 调用求阶乘的方法
        int value = getValue(n);
          // 输出结果
        System.out.println("阶乘为:"+ value);
    }
    /*
        通过递归算法实现.
        参数列表:int 
        返回值类型: int 
      */
    public static int getValue(int n) {
          // 1的阶乘为1
        if (n == 1) {
            return 1;
        }
          /*
            n不为1时,方法返回 n! = n*(n-1)!
          递归调用getValue方法
          */
        return n * getValue(n - 1);
    }
}

求阶乘的和

5!+4!+3!+2!+1!

代码实现

static int d(int i) {
    if(i==1) {
        return 1;
    }else {
        return i * d(i-1);
    }
}
static int e(int i) {
    if(i==1) {
        return 1;
    }else {
        return d(i)+e( i-1 );//d(5)+d(4)+d(3)+d(2)+d(1)
    }
}
public static void main(String[] args) {
//        int res=s.d(5);//5*4*3*2*1
    int res=e(5);//153
    System.out.println(res);
}

原文出处:/show_1EF4seypLbVu.html