其他分享
首页 > 其他分享> > 递归

递归

作者:互联网

递归

递归调用

方法自己能不能够调用自己的方法

// 发动的方法
public void run(){
    run();
    System.out.println("汽车启动啦!");
}

这玩意直接报错了:

Exception in thread "main" java.lang.StackOverflowError
	at com.ydlclass.Car.run(Car.java:16)
	at com.ydlclass.Car.run(Car.java:16)
	at com.ydlclass.Car.run(Car.java:16)

说是栈内存溢出了:什么原因呢?每个方法的创建都会创建一个【栈帧】压入栈中。

image

所以,在使用递归的时候一定要注意,用不好,会发生栈内存溢出的问题。那怎么用好递归呢?

答案是:在合适的地方退出递归调用

斐波那切数列

斐波那契数列指的是这样一个数列 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368……

特别指出:第0项是0,第1项是第一个1。

这个数列从第三项开始,每一项都等于前两项之和。

求:在斐波那契数列中第 number个数字是多少?

分析:我们知道 除了第0个和第1个,【第number个数字】一定等于 【第number-1个数字】和 【第number-2个数字】之和。

public long fibonacci(long number) {
    return fibonacci(number - 1) + fibonacci(number - 2);
}

上边这个递归永远退不出去,应该判断number在0和1的时候,它并不需要递归,修改如下:

public long fibonacci(long number) {
    if ((number == 0) || (number == 1))
        return number;
    else
        return fibonacci(number - 1) + fibonacci(number - 2);
}


Test test = new Test();
long result = test.fibonacci(5);
System.out.println(result);
结果:
   5

【注意】:递归,一定要有合理的退出机制。

public class Recursion {

    public int fibonacci(int num){
        //递归是方法自己调用自己,在此fibonacci(int num)方法调用了fibonacci(num-1) + fibonacci(num-2),
        // 并且有if (num == 0 || num == 1){return num;作为退出
        if (num == 0 || num == 1){
            return num;
        }else {
            return fibonacci(num-1) + fibonacci(num-2);
        }
    }

    //for循环写的求传入参数的阶乘方法
    public int factorial(int num){
         int result = 1;
        for (int i = 1; i <= num; i++) {
            result *= i;
        }
        return result;
    }

    //递归写的求传入参数的阶乘方法
    public int factorial1(int num1){
        if (num1 == 1){
            return 1;//递归退出
        }
        return num1 * factorial1(num1-1);
    }

    public static void main(String[] args) {
        Recursion recursion = new Recursion();
        int fib = recursion.fibonacci(10);
        System.out.println(fib);

        int fac = recursion.factorial(3);
        System.out.println(fac);

        int fac1 = recursion.factorial1(8);
        System.out.println(fac1);
    }
}

55
6
40320

Process finished with exit code 0

标签:return,递归,int,number,num,fibonacci
来源: https://www.cnblogs.com/zuifengdeyang/p/16268413.html