黑马程序员技术交流社区

标题: 递归实现经典汉诺塔问题 [打印本页]

作者: sunnysun    时间: 2016-3-7 14:09
标题: 递归实现经典汉诺塔问题
        写了一个利用递归实现的很经典的问题 —— 汉诺塔,有兴趣的可以看看,提点意见或者建议。代码如下:
   
  1. package sample.test1;

  2. import java.util.Scanner;

  3. /**
  4. * 递归算法实现汉诺塔
  5. */
  6. public class Hanoi {

  7.   private static final String FROM = "diskA";
  8.   private static final String MID = "diskB";
  9.   private static final String TO = "diskC";

  10.   public static void main(String[] args) {
  11.     while (true) {
  12.       System.out.print("请输入需要移动的数目:");
  13.       Scanner inputScanner = new Scanner(System.in);
  14.       String input = inputScanner.nextLine();
  15.       try {
  16.         // 判断输入是否有效
  17.         if (checkIfInteger(input)) {
  18.           int num = Integer.parseInt(input);
  19.           // 进行移动
  20.           HanoiMove(num, FROM, MID, TO);
  21.           System.out.println("移动完成");
  22.           inputScanner.close();
  23.           return;
  24.         }
  25.       } catch (Exception e) {
  26.         System.err.println(e.getMessage());
  27.       }
  28.     }
  29.   }

  30.   /**
  31.    * 递归实现汉诺塔
  32.    *
  33.    * @param num
  34.    * @param from
  35.    * @param mid
  36.    * @param to
  37.    */
  38.   public static void HanoiMove(int num, String from, String mid, String to) {
  39.     // 递归出口
  40.     if(num == 1){
  41.       System.out.println("将disk1从" + from + "移到" + to);
  42.     } else {
  43.       // 先循环处理num-1个盘子,从初始A托盘移到中间B托盘
  44.       HanoiMove(num - 1, from, to, mid);
  45.       // 处理最后一个盘子,从初始A托盘移到目标C托盘
  46.       System.out.println("将disk" + num + "从" + from + "移到" + to);
  47.       // 将已经处理过的num-1个盘子再从中间B托盘移到目标C托盘
  48.       HanoiMove(num - 1, mid, from, to);
  49.     }
  50.   }

  51.   /**
  52.    * 判断输入的是否为数字
  53.    *
  54.    * @param input
  55.    * @return
  56.    * @throws Exception
  57.    */
  58.   public static boolean checkIfInteger(String input) throws Exception {
  59.     if (input != null && input.matches("^[0-9]+$")) {
  60.       return true;
  61.     } else {
  62.       throw new Exception("请输入一个数字");
  63.     }
  64.   }

  65. }
复制代码
       粘过来没格式了= =





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2