汉诺塔问题是递归中非常经典的入门问题。
问题情景
假设存在带圆孔的圆饼积木,积木半径为1,2,3,4,......,同一半径只存在一个积木,积木可放在三座塔上,但是积木必需按照半径,由长到短,依次从低到高放置。积木在塔间移动时每次只能移动一块积木。
以下时Java的代码实现:
import java.util.Scanner;
public class Hanoio {
int sum=0;
public int hansum(int n,char a,char b,char c){
if(n>1){
hansum(n-1,a,c,b);
System.out.print("积木编号"+n+"现在将从"+a+"座移到"+b+"座\n");
this.sum++;
hansum(n-1,c,b,a);
}else {
System.out.print("积木编号1现在将从"+a+"座移到"+b+"座\n");
this.sum++;
}
return this.sum;
}
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.print("请输入初始积木数量:");
int n=scanner.nextInt();
Hanoio hanoio=new Hanoio();
System.out.print("\n");
int c=hanoio.hansum(n,'A','B','C');
System.out.print(c);
}
}
效果图:
请输入初始积木数量:3
积木编号1现在将从A座移到B座
积木编号2现在将从A座移到C座
积木编号1现在将从B座移到C座
积木编号3现在将从A座移到B座
积木编号1现在将从C座移到A座
积木编号2现在将从C座移到B座
积木编号1现在将从A座移到B座
7
Process finished with exit code 0
后续问题:则么显示每次移动后三个塔的状态呢?
当输入数字变大计算机就带不动了!如果但要求得到移动步数,算法如何该进会好一些。