遞歸和回溯
遞歸
任何調用自身的函數稱為遞歸。遞歸的要點在於,遞歸函數調用自身去解決一個規模比原始問題要小一些的問題。
遞歸函數的格式
- 函數不在遞歸地情況稱作基本情形(base case,也稱基本情況)。
- 函數調用自身來執行子任務的情況就稱作遞歸情形(recursive case)。
if (判斷是否為基本情形)
return 該基本情形時的函數值
else if (判斷是否為另一種基本情形)
return 該基本情形時的函數值
//遞歸情形
else return (執行某些工作並遞歸調用)
例:n!等於n~1之間所有整數的乘積,起遞歸定義如下
n! = 1 n=0|1 (基本情形)
n! = n*(n-1)! n>0 (遞歸情形)
代碼如下
public static int Fact(int n) {
// 基本情形:當參數為0或1時,返回1
if(n == 1)
return 1;
else if(n == 0)
return 1;
// 遞歸情形:返回n*(n-1)!
else
return n * Fact(n - 1);
}
遞歸和內存可視化
public static int Print(int n) {
if (n == 0)
return 0;
else {
System.out.println(n);
return Print(n - 1);
}
}
回溯
回溯是一種采用分治策略進行窮舉搜索的方法。