zoukankan      html  css  js  c++  java
  • 数据结构(java语言描述)递归实现——汉诺塔问题

    1.汉诺塔问题描述

    N阶汉诺塔:假设有3个分别命名为x,y,z的三个塔座,在x上有n个盘子,直径大小不同,有小到大按标号1,2,3...n排列,要借助y将n个盘子转移到z上,期间不能让小盘子压在大盘子上。规则:

    • 每次至移动一个盘子;
    • 盘子可以插在x,y,z任意一个塔座上;
    • 任何时候都不能将大盘压在小盘上。

    2.解题思路

    当n=1时,直接把盘子由x——>z;

    当n>1时,需利用y,首先将(n-1)个盘子由x——>y,把第n个实现x——>z,然后把问题转换为实现(n-1)个盘子由y——>z,借助x;

    实现n个盘子由x到z的时候,先把n-1个搬到y上,把第n个搬到z上;然后再借助z,把n-1个盘子搬回x.

    循环实现(n-1)个盘子由x到z.

    注意:最初递归中涉及到搬盘子都用move()实现一落盘子中最大的那一个,可以在此坐标记。

    3.代码

    package hanoi;
    public class hanoi {
        private int c=0;
        public void hanoi(int n,char x,char y,char z){
            if (n==1)
            {
                move(x,1,z);
            }else
            {
                hanoi(n-1,x,z,y);
                move(x,n,z);
                hanoi(n-1,y,x,z);
            }
        }    
    public void move(char x,int n,char z){
        System.out.println("第"+ ++c +"次移动:"+n+"号盘子,"+x+"——>"+z);
    }
    public static void main(String[] args){
        hanoi e=new hanoi();
        e.hanoi(5, 'x', 'y', 'z');
    }
    }

    n=4时,运行结果:

    第1次移动:1号盘子,x——>y
    第2次移动:2号盘子,x——>z
    第3次移动:1号盘子,y——>z
    第4次移动:3号盘子,x——>y
    第5次移动:1号盘子,z——>x
    第6次移动:2号盘子,z——>y
    第7次移动:1号盘子,x——>y
    第8次移动:4号盘子,x——>z
    第9次移动:1号盘子,y——>z
    第10次移动:2号盘子,y——>x
    第11次移动:1号盘子,z——>x
    第12次移动:3号盘子,y——>z
    第13次移动:1号盘子,x——>y
    第14次移动:2号盘子,x——>z
    第15次移动:1号盘子,y——>z

  • 相关阅读:
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    Apache Spark RDD(Resilient Distributed Datasets)论文
    Apache Spark 2.2.0 中文文档
    Apache Spark 2.2.0 中文文档
    【机器学习实战】第10章 K-Means(K-均值)聚类算法
    [译]flexbox全揭秘
  • 原文地址:https://www.cnblogs.com/xleer/p/5302727.html
Copyright © 2011-2022 走看看