递归经典问题:汉诺塔Java实现

思路

假设为起始柱A、辅助柱B及目标柱C,盘子数量为n
那么j可以将盘子从A全部转移到C分为三步:
1.A上面的n-1个盘子从A全部移到B
2.A上剩下的最大盘子移到C(C是目标柱所以要把最底层的移动到C)
3.B上n-1个移到C

其中1和3步的实现也是个汉诺塔问题,层层递归,解决两个盘的汉诺塔问题就可以解决多个盘的汉诺塔问题。根据此思路写出第一版本代码。

代码及代码优化

版本一:

void HanoiTower(int n,char from,char buffer,char to){
		if(n<1){
			System.out.println("input error");
		}
		else if(n==1){
			System.out.println(from+"->"+to);
		}
		else if(n==2){
		    System.out.println(from+"->"+buffer);
		    System.out.println(from+"->"+to);
		    System.out.println(buffer+"->"+to);
		}
		else{
			HanoiTower(n-1,from,to,buffer);
			System.out.println(from+"->"+to);
			HanoiTower(n-1,buffer,from,to);
		}
	}

后来发现两个盘子的情况可以并入多个盘子的情况,所以去掉n=2分支,版本二如下:

void HanoiTower(int n,char from,char buffer,char to){
		if(n<1){
			System.out.println("input error");
		}
		else if(n==1){
			System.out.println(from+"->"+to);
		}
		else{
			HanoiTower(n-1,from,to,buffer);
			System.out.println(from+"->"+to);
			HanoiTower(n-1,buffer,from,to);
		}
	}

完整运行代码与运行结果

package chapter1;

public class Hanoitower {
	
	public static void main(String[] args){
		Hanoitower h=new Hanoitower();
		for(int i=0;i<5;i++){
			System.out.println("Hanoi Tower"+i);
			h.HanoiTower(i,'a','b','c');
		}
	}
	
	void HanoiTower(int n,char from,char buffer,char to){
		if(n<1){
			System.out.println("input error");
		}
		else if(n==1){
			System.out.println(from+"->"+to);
		}
		else{
			HanoiTower(n-1,from,to,buffer);
			System.out.println(from+"->"+to);
			HanoiTower(n-1,buffer,from,to);
		}
	}
}

运行结果如下(Hanoi Tower n 表示解决n个盘子的汉诺塔问题):

Hanoi Tower0
input error
Hanoi Tower1
a->c
Hanoi Tower2
a->b
a->c
b->c
Hanoi Tower3
a->c
a->b
c->b
a->c
b->a
b->c
a->c
Hanoi Tower4
a->b
a->c
b->c
a->b
c->a
c->b
a->b
a->c
b->c
b->a
c->a
b->c
a->b
a->c
b->c

最后

好久没写java了,而且本人编程基础薄弱,有错请指正。

发布了14 篇原创文章 · 获赞 0 · 访问量 309

猜你喜欢

转载自blog.csdn.net/zmx1952822326/article/details/100676519
今日推荐