33,311
社区成员
发帖
与我相关
我的任务
分享
public static void main(String[] args) throws Exception {
hanno(5, 'A', 'C', 'B');
}
public static void hanno(int n, char A, char C, char B) {
if (n == 1) {
System.out.printf("%c-->%c\n", A, C);
return;
}
hanno(n - 1, A, B, C);
hanno(1, A, C, B);
hanno(n - 1, B, C, A);
}
// 这个函数表示,完成n个盘子在三个柱子上的hanoi运算。
//我们要“证明” ,hanoi(n-1)如果能搞定,那hanoi(n)也就能搞定!
//然后,只需要给出hanoi(1)的解决方式就OK了。
void hanoi(int n,char one,char two,char three) /*定义hanoi函数*/
{
void move(char x,char y); /*对move函数的声明*/
if(n==1) //当n=1时,问题很简单。
move(one,three);
else //n不等于1时,注意理解递归的妙处。
{
/*下面其实可以看作由f(k)->f(k+1)的一个推理。
假设hanoi(n-1)的我们能搞定,则通过下面的过程,我们能搞定hanoi(n)!!*/
hanoi(n-1,one,three,two); // 我们当A柱最底下那个盘子不存在,把上面N-1个盘子的移动到B上面。
move(one,three); //把刚才没管的那个盘子放到C柱上。
hanoi(n-1,two,one,three);//把B柱上的盘子再移到C柱上。
/* 这时结合前面n=1的情景,可以得出,这个方法对任意的N都适用。 */
}
}