1. 程式人生 > >java基礎篇———————— 遞迴控制及漢諾塔

java基礎篇———————— 遞迴控制及漢諾塔

一: 遞迴控制:
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);
        }
    }