河內塔是一個數學遊戲:有三個塔柱A、B、C,遊戲的目的就是將A塔柱的圓盤全數移到C塔柱
遊戲有幾個規則:
1. 一次只能搬移一個圓盤
2. 小圓盤可以移到大圓盤上面,大圓盤不可以移到小圓盤上面。
事實上,可以從河內塔移動次數中,發現這是有遞迴規則的。
以最小的圓盤 n 為例:
當圓盤總數為 1 時, n 移動了 1 次
當圓盤總數為 2 時, n 移動了 2 次
當圓盤總數為 3 時, n 移動了 4 次
當圓盤總數為 4 時, n 移動了 8 次
為了要讓大盤可以移出來到目的柱,當盤數越多,其他較小圓盤就必須先移到暫存柱(三柱其中一柱)
若有n個盤子,則移動完畢所需的次數為2^n - 1
Java
import java.util.Scanner; public class HanoiTower { public static void main(String args[]) { System.out.print("請輸入盤數:"); Scanner s = new Scanner(System.in); hanoi(s.nextInt(), 'A', 'B', 'C'); } public static void hanoi(int n, char start, char temp, char end) { if(n > 0){ //將所有盤子移到暫存區 hanoi(n - 1, start, end, temp); //將最後一個盤子移到目的區 display(n, start, end); //把暫存區的盤子移回目的區 hanoi(n - 1, temp, start, end); } } public static void display(int n, char start, char end) { System.out.println("Move ring " + n + " from " + start + " to " + end); } }