Chinaunix首页 | 论坛 | 博客
  • 博客访问: 59973
  • 博文数量: 16
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 185
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-02 20:05
文章分类
文章存档

2008年(16)

我的朋友

分类:

2008-03-05 16:28:55

最近闲来无事外加心血来潮小小的写个汉诺塔程序,复习下递归
 
从左到右依次编号A,B,C栏。
 
当只有一个盘的时候是最简单的,直接移动到目的地即可。
if (n == 1) {
      move(n, A, C);
  }
       
        当有两个盘的时候也很简单,把第一个移到B,接着把最下面的移到C,最后把中间的移到C,结束。
 
        当有N个盘的时候可以这样理解,先把上面的N-1个盘从起点A移动到B,然后把最下的那个盘移动到C,最后把B上的全移动到C,(即以A为起点,B为辅助栏,C为终点进行移动)结束。
        而那N-1个盘的从A移动到B可以理解为是以A为起点,B为终点,C为辅助栏的移动。当然移动方法就是先把上面的N-2个盘以A为起点,B为终点,C为辅助栏进行移动。
        以此类推,每次移动就是先移动上面的N-1个到辅助栏,然后把最下的那个移动到终点,最后把上面的N-1个移动到终点。起点终点辅助栏每次都不一样。
        然后可以开始递归,代码如下:
public static void hanoi(int n, char A, char B, char C) {
  if (n == 1) {
      move(n, A, C);
  } else {
      hanoi(n - 1, A, C, B);//把上面N-1个从起点A移动到辅助栏B,即把A到起点,B当终点,C当辅助栏
      move(n, A, C);//把最下面的盘子从起点A,移动到终点C
      hanoi(n - 1, B, A, C);//把B上的N-1块盘子以B为起点,C为终点,A为辅助栏移动
  }
    }

    public static void move(int x, char now, char dest) {
  System.out.println(count++ + ". move " + x + " from " + now + " to "
    + dest);
    }
阅读(908) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~