漢諾塔遞迴實現——Java程式碼
阿新 • • 發佈:2018-12-09
在遞迴中不斷重複以下步驟: 若要將N層從X轉移到Z,則需要將N-1層從X轉移到Y,再將第N層從X轉移到Z,最後將N-1層從Y轉移到Z;將N層從從X轉移到Y、Y轉移到Z、Y轉移到X、Z轉移到X、Z轉移到Y也類似。 返回條件:N == 1時,第N層直接轉移到Z。(從X轉移到Z情況)
import java.util.Scanner;
public class HanoiTower
{
private int steps = 0; //完成遊戲需要的最少步數
public HanoiTower(){}
public int getSteps(){
return steps;
}
/*
public int getSteps(int num){
int steps;
if(num == 1){
steps = 1;
return steps;
}
steps = 2*this.getSteps(num-1)+1;
return steps;
}
*/
public void printXToZ(int num){
if(num == 1){
System.out .print(num + "->Z ");
steps++;
return;
}
printXToY(num - 1);
System.out.print(num + "->Z ");
steps++;
printYToZ(num - 1);
}
public void printYToZ(int num){
if(num == 1){
System.out.print(num + "->Z " );
steps++;
return;
}
printYToX(num - 1);
System.out.print(num + "->Z ");
steps++;
printXToZ(num - 1);
}
public void printYToX(int num){
if(num == 1){
System.out.print(num + "->x ");
steps++;
return;
}
printYToZ(num - 1);
System.out.print(num + "->x ");
steps++;
printZToX(num - 1);
}
public void printZToX(int num){
if(num == 1){
System.out.print(num + "->x ");
steps++;
return;
}
printZToY(num - 1);
System.out.print(num + "->x ");
steps++;
printYToX(num - 1);
}
public void printXToY(int num){
if(num == 1){
System.out.print(num + "->y ");
steps++;
return;
}
printXToZ(num - 1);
System.out.print(num + "->y ");
steps++;
printZToY(num - 1);
}
public void printZToY(int num){
if(num == 1){
System.out.print(num + "->y ");
steps++;
return;
}
printZToX(num - 1);
System.out.print(num + "->y ");
steps++;
printXToY(num - 1);
}
public static void main(String[] args)
{
int num;//漢諾塔層數
Scanner scanner = new Scanner(System.in);
System.out.println("Please input the floors of HanoiTower:");
num = scanner.nextInt();
HanoiTower hanoiTower = new HanoiTower();
hanoiTower.printXToZ(num);//將漢諾塔從X位置移到Z位置
System.out.println();
System.out.println("Steps:" + hanoiTower.getSteps());
}
}