Java实现汉诺塔(Hanoi)的递归与非递归两种方法。

汉诺塔的递归方法相信很好理解,不过作为Java初学者,我暂时不知道怎样才能在递归解法的基础上添加某些方法,来展示具体在某一步移动前后A、B、C三根柱子的状态(分别有哪些圆盘,在哪个柱子上面。)这个暂放,待思考。若您有好的方法也希望不吝赐教。以下是递归的简单写法。

public class Hanoi1
{
	private int n;
	private String a;
	private String b;
	private String c;
	
	public void move(int n , String a ,String b ,String c)
	{
		if(n<1)
		{
			System.out.println("Wrong Number <0");
		}
		else if(n == 1)
		{
			System.out.println(a + ">>"+ c);
		}
		else
		{
			this.move(n-1, a, c, b);
			System.out.println(a + ">>"+c);
			this.move(n-1, b, a, c);
		}
	}

}

因希望能得知在移动前后,三根柱子的状态。同时既知道汉诺塔有非递归的解法,查阅其具体循环原理后,得出了以下非递归的方法。

//本方法建立在以下三个基本理论上面,若这些理论无效,则无法通过这种方式解出。
//1.汉诺塔的总步数为2^n-1。
//2.汉诺塔的移动第一步总是将顶盘(最小盘top),以A>>B>>C>>A>>B>>C……的顺序移动一步。
//3.汉诺塔第二部移动总是在非顶盘(not-top)的两个柱间进行移动。若其中一个为空柱,则移动到空柱。否则,将小盘移动到大盘。
//重复第2、3两部,当移动步数等于2^n-1的时候,则移动结束。
//注意,若n为奇数的时候,实际移动结果为,所有的盘都移动到了B柱位置。此时只需要在移动前,将B和C交换(B和C对应的引用交换一下)位置即可。
//介于所有的实现,都必须是建立在以上的基础理论上。所以其实仅仅是把这种现实方法转换成计算机方法而已。
//只需要用计算机方法描述该过程就可以了。

因为该方法是基于一套简单的循环思路,所以虽自己摸索写出了该方法,似乎也仅是对汉诺塔该解法有所得,但并没有其它方面的提高。仅仅是把初学的一些知识融会贯通而已。同时该方法并非一次成型,本是希望能

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值