JAVA程序归递算法求解汉诺塔问题

来源:百度知道 编辑:UC知道 时间:2024/06/27 15:47:30
public class Hanoi
{ private int c;
public Hanoi()
{c=0;}
public void move(char getme,char purone)
{ c=c+1;
System.out.println(getme+"-->"+putone+"搬盘次数为:"+c);
}
public void hanoi(int n,char one,char two,char three)//这个程序我有点难理解
{if(n==1)moce(one,three);//这里调用move,并把one和three赋值给getone和putone吗?
else{hanoi(n-1,one,three,two);//调用自己?怎么理解啊?
move(one,three);
hanoi(n-1,two,one,three);}//又怎么理解啊,麻烦大哥大姐说详细些
}
}
}
public class HanoiText
{ public static void main(string args[])
{int m=4;
System.out.println("搬"+m+"个盘数的步骤:");
Hanoi a=new Hanoi();
a.hanoi(m,'A','B','C');//帮我把这步联系前面的结实下啊,谢谢了!
}
}//若实参hanoi(m,'A','B','C'),那第一个自动我调用hanoi(n-1,one,three,two);中的n-1=m one=‘A’ three=‘B’ two=‘C’?是这样吗?

首先你需要有下面这两个意识:
1.一个函数对于其它函数来说相当于一个盒子,他封装了其中的内容,其它函数只知道给它参数,然后得到它的结果。就好比一个做蛋糕的商店:我们只需要知道给钱,它就会给蛋糕。而我们不需要理解他们是怎么做出来的这个蛋糕。
2.调用的过程,就相当于上面例子中我们去买蛋糕的过程。谁说自己不能买自己店里的蛋糕呢?比如你是做蛋糕的,难道你不能买自己店里的蛋糕吗?函数的自我调用(递归?)也是这么回事情。

对于hanoi类里面,两个核心函数:
move(char getme, char purone):
这个函数的功能是:把getme最上面的盘子移动到purone位置,比如
move('A','B')就是把A柱子最上面那个盘子移动到B柱子的最上面。

hanoi(int n,char one,char two,char three):
这个函数的功能是:现在在柱子one上一共有n个盘子,这个函数能够通过two把它移动到three上面。

现在你了解了这两个函数设计的初衷,ok,我们来分别实现每个函数。

public void move(char getme,char purone)
{//请联系上面写的这个函数的功能来看:
c=c+1;//我们每移动一步,就计数一次
System.out.println(getme+"-->"+putone+"搬盘次数为:"+c);
//这行使用输出来表明移动过了(事实上hanoi就是要让你详细说明移动过程,所谓“说明”,就是打印出每次的移动,那这里我们就把这次移动打印出来,这个没有任何问题吧?这个函数就是要把移动这件事情说出来,明白?
}

public void hanoi(int n,char one,char two,char three)
{//请回忆hanoi函数的功能,是要把one柱子上的前n个放到three柱子上:
if(n==1) //如果n==1,那也就是要把one柱子上最上面的那个移