1. 程式人生 > 其它 >【DIY】【CSAPP-LAB】深入理解計算機系統--datalab筆記

【DIY】【CSAPP-LAB】深入理解計算機系統--datalab筆記

遞迴

遞迴呼叫

方法自己能不能夠呼叫自己的方法

// 發動的方法
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)

說是棧記憶體溢位了:什麼原因呢?每個方法的建立都會建立一個【棧幀】壓入棧中。

所以,在使用遞迴的時候一定要注意,用不好,會發生棧記憶體溢位的問題。那怎麼用好遞迴呢?

答案是:在合適的地方退出遞迴呼叫

斐波那切數列

斐波那契數列指的是這樣一個數列 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