汉诺塔 (Tower of Hanoi)java实现

Posted 小写丶H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汉诺塔 (Tower of Hanoi)java实现相关的知识,希望对你有一定的参考价值。

汉诺塔是典型的递归题的代表,今天就用java语言来实现。

首先,我们是得知道规则,大圆盘必须在小圆盘下面,一次只能一个圆盘。这样我们就可以构思了。

思路:以三个圆盘为例
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

这样就实现了。。

代码实现:

public class Hanoi {
    //从site1移到site2
    public static void move(char site1,char site2){
        System.out.print(site1+" ->"+site2+" ");
    }

    //site1 起始位置
    //site2 中途位置
    //site3 目标位置
    public static void hanoi(int n,char site1,char site2,char site3){

         if(1==n){
             move(site1,site3);
         }else{
             hanoi(n-1,site1,site3,site2);
             move(site1,site3);
             hanoi(n-1,site2,site1,site3);
         }
    }
    public static void main(String[] args) {
        hanoi(1,'A','B','C'); //有一个盘子,
        System.out.println();
        hanoi(2,'A','B','C'); //有两个盘子
        System.out.println();
        hanoi(3,'A','B','C'); //有三个盘子
    }
}

在这里插入图片描述
这里提醒,千万不要想着把这个递归函数展开,否则非常复杂,当只有一个圆盘,需要移 1次; 两个,需要移 3次;三个,需要移动7次; 也就是,有n的圆盘,需要移动(2^n)-1。
所以,当n=64时,可想而知,假如每秒钟移动一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下:18446744073709551615秒
这表明移完这些金片需要5845.54亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845.54亿年,不说太阳系和银河系,至少地球上的一切生命都早已经灰飞烟灭。
温馨提示:
递归思想,只要我们推出公式就好了,不要太过于执着展开。

以上是关于汉诺塔 (Tower of Hanoi)java实现的主要内容,如果未能解决你的问题,请参考以下文章

列表形式的汉诺塔(Tower of Hanoi)Python语言实现

汉诺塔(Tower of Hanoi) 递归代码实现 c语言(顺序栈实现)

汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法

CF392B Tower of Hanoi

用递归方法解决汉诺塔问题(Recursion Hanoi Tower Python)

Hanoi Tower 汉诺塔的简单分析/C