方法的递归调用

在一个方法中可以调用其它的方法:如在A方法中调用B方法:

package com.dh.method;

public class Method03 {

    public static void main(String[] args) {
        a();
    }
    public static void a(){
        System.out.println("我是A");
        b();
    }
    public static void b(){
        System.out.println("我是B");
    }
}

可以看到是没有问题的,那我们在方法B中也调用方法A呢?

package com.dh.method;

public class Method03 {

    public static void main(String[] args) {
        a();
    }
    public static void a(){
        System.out.println("我是A");
        b();
    }
    public static void b(){
        System.out.println("我是B");
        a();
    }
}

一开始是没有问题的,可是后来却炸了!

我们可以看到,程序报了一个栈溢出错误。因为方法没有终止的条件,A调用B,B又调用A,就相当于A会一直调用自己,导致栈内存不够了(方法需要存放在栈中),所以导致溢出了。这是个很严重的错误!

1.什么是递归?

一个方法自己调用自己就是递归。

我们需要确定什么时候调用自己,但是也要确定在什么时候就不再调用自己了,程序就会停下来,如果没有的话,程序就会进入死循环,那必定会发生栈溢出错误。

2.实例理解递归

我们利用递归来解决数的阶乘问题:先回忆一下阶乘如何计算

1!=1

2!=1x2;

3!=1x2x3;

......

n!=1x2x3x4......(n-1)n,也可以写作n*(n-1)!

分析一下:首先将n传递给方法,如果n=1时,直接返回1,这也是停止递归调用的条件。

package com.dh.method;

public class FactorialDemo {

    public static void main(String[] args) {

        //计算器计算:10!=3628800
        System.out.println(factorial(10));
    }

    public static int factorial(int n){
        if(n==1){
            return 1;
        }else {
            return n*factorial(n-1);
        }
    }
}

我们只需要使用上述很简洁的方法就可以计算出结果了!

所以,递归也是有它的好处的。利用递归可以将一个复杂的大问题化为一个与原问题相似的规模较小的问题来求解,即大事化小,将可以大大的减少程序的代码量。


综上:递归是把双刃剑~

当问题规模较小的时候可以利用递归的大事化小思想来解决,但是问题规模大的时候,利用递归就很容易发生栈溢出的错误,一旦没有注意到递归终止条件,也会发生栈溢出错误,所以,少用递归,慎用递归啊~

水平有限,若有错误烦请指出~

posted @ 2021-01-18 09:52  deng-hui  阅读(318)  评论(0)    收藏  举报