遞迴的基本思想
什麼是遞迴:
通常,遞迴是函式直接或間接呼叫自身的時間。例如:
// This method calls itself "infinitely"
public void useless() {
useless(); // method calls itself (directly)
}
將遞迴應用於問題的條件:
使用遞迴函式解決特定問題有兩個前提條件:
-
問題必須有一個基本條件,它將是遞迴的端點。當遞迴函式達到基本條件時,它不再進行(更深)遞迴呼叫。
-
每個級別的遞迴都應該嘗試一個較小的問題。因此遞迴函式將問題分成越來越小的部分。假設問題是有限的,這將確保遞迴終止。
在 Java 中有第三個前提條件:沒有必要過於徹底地解決問題; 在 Java 中看到深度遞迴是有問題的
例
以下函式使用遞迴計算階乘。注意方法 factorial
如何在函式內呼叫自身。每當它呼叫自身時,它將引數 n
減少 1.當 n
達到 1(基本條件)時,函式將不再遞迴。
public int factorial(int n) {
if (n <= 1) { // the base condition
return 1;
} else {
return n * factorial(n - 1);
}
}
這不是計算 Java 中因子的實用方法,因為它沒有考慮整數溢位,或者對於 n
的大值呼叫堆疊溢位(即 StackOverflowError
異常)。