上一篇文章讨论一个经典的递归实例(Fibonacy数列问题),如今来讨论一下另一个经典的递归例子:汉诺塔问题: java
问题描述:在一个铜板上面立有三根杆(编号A/B/C),A杆上串有若干大小不一的金盘,且小盘在上大盘在下,要把A杆上面的金盘所有转移到C盘上面去,且维持原有的顺序,搬运过程当中能够借助B杆,可是必须遵循下列两条规则: this
● 每次只能移动一个盘子 spa
●在每次移动中不容许出现大盘压在小盘上面的状况 .net
如今对问题进行分析:把金盘按照从小到大进行编号,依次为p一、p二、p3.....pn而后: code
当n=1时,直接从A盘移到C盘 blog
当n>1时,把搬运任务进行分解: 递归
第一步,将A上的n-1(杆顶部的)个盘子从A上面搬到B上面,借组C杆 get
第二步,将pn(第n个盘子)从A杆搬到C杆 class
第三步,将B上面的n-1个金盘搬到C上面,借组A杆 im
具体实现代码以下:
public class TestHanoi{ privte int times=0; //用来计算搬移的次数 public static void main(String []args){ TestHanoi t=new TestHanoi(); t.hanoi(3,"A","B","C"); } public void hanoi(int n,char a,char b,char c){ //有n个金盘,a/b/c为杆 //当n=1时直接搬运 if(n==1){ times++ System.out.println(times+":"+”将p1从”+a+"搬到"+c); }else{ this.hanoi(n-1,a,c,b); times++; System.out.println(times+":"+”:\t”+”将p”+"n"+"从"+a+"搬到"+c); this.hanoi(n-1,b,a,c); } } }这个例子须要好好的体会。