java基礎篇———————— 遞迴控制及漢諾塔
阿新 • • 發佈:2018-11-21
一: 遞迴控制:
1:遞迴:就是程式一層一層呼叫自身,從而將問題規模層層減小,解除結果;
(1)遞迴必須要滿足的兩個條件:
.子問題須與原始問題為同樣的事,且更為簡單;
.不能無限制地呼叫本身,須有個出口,化簡為非遞迴狀況處理。
( 2 )遞迴的優缺點:
優點: 遞迴語句簡單。
缺點:遞迴是在棧上開闢記憶體來儲存臨時變數;如果遞迴次數過多,會導致滿棧,導致棧溢位。
總結: 在不必要時不要用遞迴。
首先用For迴圈寫一個求5的階乘
int i = 1; for (int j = 1; j < n + 1; j++) { i *= j; } return i;
再用遞迴寫一個求5的階乘:
int i = 1;
if (n == 1) { // 此處是終止條件 如果沒有此條件會導致棧溢位 報錯資訊:java.lang.StackOverflowError
n *= 1;
return n;
} else {
n *= facPuls(n - 1); // 此處是呼叫自身,並將問題規模逐層減少
return n;
}
2:漢諾塔問題
首先漢諾塔的移動次數等於 2^(盤子個數) -1 個;
public static void move(char pos1,char pos2) { // 首先, 考慮只有一個盤子時如何移動 System.out.print(pos1+"==>"+pos2 + " "); // 直接將盤子移動到目標區域去 } public static void hanio(int n,char pos1,char pos2,char pos3) { if(n == 1) { move(pos1,pos3); } else { hanio(n-1,pos1,pos3,pos2); move(pos1,pos3); hanio(n-1,pos2,pos1,pos3); } }