A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

问题描述:
从左到右 X  Y Z 柱 大盘子在下, 小盘子在上, 借助B柱将所有盘子从A柱移动到C柱, 期间只有一个原则: 大盘子只能在小盘子的下面.
如果有3个盘子, 大中小号, 越小的越在上面, 从上面给盘子按顺序编号 1(小),2(中),3(大), 后面的原理解析引用这里的编号.

分析,这个是一个经典的递归问题.我们现在可做如下设想
1,递归结束条件,当X上有一个盘子的时候,直接将盘子拿到Z就ok
2,如果盘子有n个,那么将n-1个盘子借助Z从X移动到Y.hanoi(n-1,X,Y,Z)
   那么将X上剩下的最大盘子移动到Z
   接下来将n-1个盘子从Y借助Z移动到X

PS:那么会有一个疑问, 移动的n-1个盘子怎么移动呢? 呵呵,使用递归.
这样n个规模的问题分解n-1和一个, n-1继续分解, 那么一直分解到最小问题或者有解,这样大问题的解也就出来了

汉诺塔代码如下:
  1. /**
  2. * <p>Title: HanoiRecursion.java</p>
  3. * <p>Description: </p>
  4. * <p>Copyright: Copyright (c) 2015</p>
  5. * @author possible
  6. * @date 2015年5月4日
  7. * @version 1.0
  8. */
  9. package com.dl.recursion;

  10. public class HanoiRecursion {
  11.         public static void hanoi(int counter, String src, String helper, String des) {
  12.                 if (counter == 1) {//递归结束条件
  13.                         move(counter, src, des);
  14.                 } else {
  15.                         //将counter-1个盘子从src借助des移动到helper
  16.                         hanoi(counter - 1, src, des, helper);
  17.                     //将最大的从src移动到des
  18.                         move(counter, src, des);
  19.                         //将counter-1个盘子从helper借助des移动到src
  20.                         hanoi(counter - 1, helper, src, des);
  21.                 }

  22.         }

  23.         private static void move(int name, String src, String des) {
  24.                 System.out.println("将 " + name + "从" + src + "  移动到   " + des);
  25.         }
  26. }
复制代码



测试代码:
  1. public static void main(String[] args) {
  2.                 HanoiRecursion.hanoi(4, "X", "Y", "Z");
  3.         }
复制代码


PS:移动的不要太大, 如果是64,呵呵, PC一天两天也递归不完.......

2 个回复

倒序浏览
太聪明了,受教了,谢谢
回复 使用道具 举报
学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马