1. 程式人生 > >基於java的漢諾塔遞迴演算法

基於java的漢諾塔遞迴演算法

1.假如a盤上有2個盤子,需要移動到c盤上,如圖:

有兩個盤子時,需要三步就可以完成,第一步:把上面的移動到b;第二步:把下面的大的移動到才c;第三步:再從b移動到c,完成;

2.假如a盤上有3個盤子,需要移動到c盤上,如圖:


當有三個盤子的時候,就需要如圖所示的7步,才能完成。這裡要總體思考,先看最後一步固定的:不是從a移動到c,

就是從b移動到c(2個盤子的是b--->c;3個盤子的是a--->c;)

所以要整體考慮,把a上面的1和2看成一個整體,把1和2移動到b上面(就是如圖所示的第三步),

然後在把a上的3移動到c(就是如圖所示的第四步),最後在把b上的1和2移動到c上就完成了,

這三步是最核心的思想,在寫程式時就需要用這個思路,不管多少個盤子都是需要這樣移動。

不過在具體的手動操作時就需要其中的另外的一個柱子來輔助,在演算法中用遞迴就是這樣的實現。

3.用java來實現:

(1)首先要想用遞迴思想來實現

(2)用遞迴,要考慮最後一步,就是遞迴的結束點

(3)用遞迴需要考慮哪幾步,就是上面分析的:把下面最大的看成一個,上面的所有看成一個整體,然後分為三步來實現

(4)需要考慮盤子的移動要怎麼在程式中表現出,在遞迴的方法中用那幾個引數(四個引數:盤子的個數:1.就是每個盤子的編號;2.A柱子;3.B柱子;4.C柱子)

import java.io.IOException;
import java.util.Scanner;

public class Hanoi {
	 static long count;
	public static void main(String[] args) throws NumberFormatException, IOException {
			System.out.println("請輸入盤子的個數:");
			Scanner sc = new Scanner(System.in);
	        int n = sc.nextInt();
	        Hanoi hanoi = new Hanoi();
	        hanoi.move(n, 'A', 'B', 'C');
	        System.out.println(count);
	}
	public void move(int n, char a, char b, char c) {
        if (n == 1){
            System.out.println("盤 " + n + " 由 " + a + " 移至 " + c);//這道題 遞迴思想的第三步(最後一步)
        	count++;
        }else {
            move(n - 1, a, c, b);//這道題中遞迴思想的第一步
            System.out.println("盤 " + n + " 由 " + a + " 移至 " + c);
            count++;
            move(n - 1, b, a, c);//這道題中遞迴思想的第二步(倒數第二步)
        }
    }
}

執行例如:

請輸入盤子的個數:

3

盤 1 由 A 移至 C
盤 2 由 A 移至 B
盤 1 由 C 移至 B
盤 3 由 A 移至 C
盤 1 由 B 移至 A
盤 2 由 B 移至 C
盤 1 由 A 移至 C
7

4.理解程式的過程:

1、在上面的演算法中,首先判斷的就是n是否等於1,1代表的就是最上面最小的那個盤子,如果n=1就說明是最後一步把小的移動到C上就完成了。

2、如果n不等於1,就是先把A上的除下面的最大的其他的一個整體(例如3個盤子就是1和2)移動到B,因為在輸出時,是從第一個引數移動到第三個引數,所以遞迴呼叫時把第三個引數和第二個引數調換一下位置就是把A柱子上的除了最大的其他所有移動到B柱子上(3個盤子的就是1和2)

3、然後就是這道題中遞迴思想的第二步:把B柱子上的盤子移動到C柱子,當完成一步時,n就等於1了,然後最後一步把最後一個盤子移動到C柱子上,ok程式結束。