【DIY】【CSAPP-LAB】深入理解計算機系統--datalab筆記
阿新 • • 發佈:2022-05-10
遞迴
遞迴呼叫
方法自己能不能夠呼叫自己的方法
// 發動的方法
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