递归实现汉诺塔

**

汉诺塔:

**
直接说规则。有三个柱子,分别为a,b,c,在a上套着多个圈,圈是按照由小到大的顺序套在a上,目标是把a上的圈转移到c上。一次只能转移一个圈,且圈转移到任何柱子上时都是由小到大的顺序,也就是说大的圈不能套在小的上面。求移动次数。显示图:
递归实现汉诺塔_第1张图片
分析:
圈的个数i=1时,移动方法:a->c
i=2时,移动方法:1从a移到b,2从a移到c,然后将1从b移到c
i=3时,这时的移动便变的麻烦了,这时我们可以用这种思路:将1和2看成一个整体,这是便变成移动2个圈了,但首先我们要将这两个圈分开,我们可以将1.2先放在b上,3放到c上,(也就是1从a移到c,2从a’移到b,1从c移到b,){3从a移到c。}此时完成分离。
【再将1从b移到a,2从b移到c,1从a移到c,】移动完成。
此时可以发现一个现象:。i=1时,是将i从a移到c;i=2时,是1.2从a移到c的三步。而i=3时,可以分为三个部分,第一部分,也就是()的,是1.2从a移到b的三步;第二部分,{}里的,是将i从a移到c;第三部分。【】里的,是1,2从b移到c的三步,也就是说,i=3时,包含i=1,i=2时的操作,只是出发位置与目的地会发生变化而已。
再看i=4时,可以将1.2.3看成一个整体,移动:(1.2.3从a到b),{4从a到c},【1.2.3从b到c】,发现的现象吻合实际,规律找到。
………………………………….
规律:
i>2时,移动顺序:三部分:(i-1顺序从a到b){i从a到c}【i-1顺序从b到c】
((突然发现i=2时,也适用@@!!))
改:i>1时,移动顺序:三部分:(i-1顺序从a到b){i从a到c}【i-1顺序从b到c】
代码实现:

public class TowerofHanoi {
	public static void main(String[] args) {
		hanoi(5,'a','b','c');
	}
	/**
	 * 
	 * @param n n个圈
	 * @param from 开始柱子a
	 * @param in 中间柱子b
	 * @param to 目标柱子c
	 */
	public static void hanoi(int n,char from,char in,char to) {
		if (n==1) {
			System.out.println("第1个盘子从"+from+"移动到"+to);
		}else {
			hanoi(n-1, from, to, in);//()第一部分
			System.out.println("第"+n+"个盘子从"+from+"移动到"+to);//{}第二部分
			hanoi(n-1, in,from , to);//【】第三部分
		}
	}
}

总结:
复杂问题也可以有简单的规律,遇到时,将它实际化,慢慢找规律,找方法实现规律,
实在找不到,就算了。。。。。。。。。。。

你可能感兴趣的:(递归实现汉诺塔)