先贴Java代码(方法部分)
public void moveTower(int NumDisks, int start, int end, int temp)
{
if(NumDisks == 0)
{
moveOneDisk(start, end);
}
else
{
moveTower(numDisks - 1, start, temp, end);
moveOneDisk(start, end);
moveTower(numDisk - 1, temp, end, start);
}
}
public moveOneDisk(int start , int end)
{
System.out.println("将盘子从"+start+"运到"+end);
}
我们从数学的相关著作可以得知,将N个盘子移到目标位置需要三步,分别是
1.将N-1个盘子从start移向temp;
2.将最大的盘子N从start移向end;
3.将N-1个盘子从temp移向end。
其中,第一步和第三步我们可以使用递归方法实现;
(对第一步的分析部分)
1.将N-2个盘子从start移向end;
2.将第N-1个盘子从start移向temp;
3.将N-2个盘子从end移向temp。
我们以三个盘子的情况为例:
分别将三个盘子按从小到大的顺序命名A,B,C;
将三根柱子以用途进行命名为start,end,temp
空间上的操作
第一步
(A,B)从start移向temp
-----> A从start移向end
-----> B从start移向temp;
-----> A从end移向temp
第二步
C从start移向end
-----> C从start移向end;
第三步
(A,B)从temp移向end
-----> A从temp移向start;
-----> B从temp移向end;
-----> A从start移向end;
我们令moveTower(int NumDisks, int start, int end, int temp)
具有功能令NumDisk盘子借助temp从start移向end;当NumDisks=0时开始执行moveOneDisk(int start , int end)
public void moveTower(int NumDisks, int start, int end, int temp)
{
if(NumDisks == 0)
{
moveOneDisk(start, end);
}
else
{
moveTower(numDisks - 1, start, temp, end);
//将(N-1)个盘子从start移向temp;
moveOneDisk(start, end);
//将最大的盘子从start移向end;
moveTower(numDisk - 1, temp, end, start);
//将(N-1)个盘子从temp移向end;
}
}
public moveOneDisk(int start , int end)
{
System.out.println("将盘子从"+start+"运到"+end);
}
程序实现原理
(图片是我自己画的,没有用软件是我没有下载这个软件)