java菜鸟---------用java写的汉诺塔问题程序

来源:互联网 发布:淘宝购物津贴有什么用 编辑:程序博客网 时间:2024/05/22 15:08

汉诺塔是递归里最经典的题。

汉诺塔问题:大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘

这个问题可以理解为:三个柱子分别是A,B,C.将A上的盘子最终全部移到到C.

如果只有一个盘子,直接将只需要一步1.A->C(A最上边的盘子移到到C的意思后边不在写字),如果是两个1.A->B 2.A->C 3.B->C.如果是3个1.A->C,2.A->B 3.C->B 4.A->C.5.B->A 6.B->C 7.A->C以此类推。。。

这时就出现了一个特点:两个盘子的时候移法1.A->B 2.A->C 3.B->C.三个盘子的时候移法1.(1.A->C,2.A->B 3.C->B)2.(.A->C.)3.(5.B->A 6.B->C 7.A->C)可以把三个盘子时也看成三步,123为一步,4一步,567一步。第一步是干嘛呢?就是将(3-1)个盘子A移动到B,第二步将A中最后一个也是最大一个盘子移到到C,最后一步将B上(3-1)盘子移到C。4个盘子5个盘子。。。。等所有你们可以把这些移到看出3个大步骤,你们可以将4个盘子的步骤全部列出来也可以这样分为3个大步。

所以1.A当一个盘子时盘子从A->C

         2.当两个盘子和两个盘子以上时都可以分为三步,设盘子为n第一步:将(n-1)个盘子A移到B   第二步将A的最后一个盘子移到C 第三步:将B上所有盘子移到C。

为此可以列出一个方程:

               1.                 A->C                 n=1;

F(n)=2    f(n-1)    A->B

                                   A->C

                      f(n-1)    B->C                  n>=2

分段函数大括号不知道如何打不要介意。

代码如下:

public class learn3 {public static void main(String[] args) {learn3 learn3=new learn3();//数字为几个盘子,ABC为3个柱子learn3.go(2,'A','B','C');}public void go(int n,char A,char B,char C){//当n=1时移法if(n==1){System.out.println(A+"->"+C);return ;}//n>=2的移法go(n-1, A, C,B);//先把A柱子上n-1个盘子通过C移动到BSystem.out.println(A+"->"+C);//将A柱子上最后一个盘子移到到Cgo(n-1, B, A, C);//最后把B柱子上所有的盘子移到到C}}

若有不足地方请各位大佬指点

                                                                                                                                                                                                                                                             一个努力成为程序员的学生