关于汉诺塔问题的Java描述(学习笔记)

先贴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);
}

程序实现原理


(图片是我自己画的,没有用软件是我没有下载这个软件)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值