问题描述:
从左到右 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继续分解, 那么一直分解到最小问题或者有解,这样大问题的解也就出来了
汉诺塔代码如下:
- /**
- * <p>Title: HanoiRecursion.java</p>
- * <p>Description: </p>
- * <p>Copyright: Copyright (c) 2015</p>
- * @author possible
- * @date 2015年5月4日
- * @version 1.0
- */
- package com.dl.recursion;
- public class HanoiRecursion {
- public static void hanoi(int counter, String src, String helper, String des) {
- if (counter == 1) {//递归结束条件
- move(counter, src, des);
- } else {
- //将counter-1个盘子从src借助des移动到helper
- hanoi(counter - 1, src, des, helper);
- //将最大的从src移动到des
- move(counter, src, des);
- //将counter-1个盘子从helper借助des移动到src
- hanoi(counter - 1, helper, src, des);
- }
- }
- private static void move(int name, String src, String des) {
- System.out.println("将 " + name + "从" + src + " 移动到 " + des);
- }
- }
复制代码
测试代码:
- public static void main(String[] args) {
- HanoiRecursion.hanoi(4, "X", "Y", "Z");
- }
复制代码
PS:移动的不要太大, 如果是64,呵呵, PC一天两天也递归不完....... |
|