Java眼中的汉诺塔问题【递归】

目录

📖汉诺塔简介

🙈汉诺塔问题

💡问题分析

1️⃣1个盘子

2️⃣2个盘子

3️⃣3个盘子

 👉总结

📝代码实现【java】


 

📖汉诺塔简介

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

8dcf919ff0814b419da49e67523ed079.png

🙈汉诺塔问题

现在有三根柱子,分别为A、B、C,现在在A柱子上有64个盘子,大小不一样,大盘子在下边,小盘子在上边。现在需要把64个盘子挪到C柱子上,请问怎样挪动,需要多少次才能完成?

💡问题分析

1️⃣1个盘子

首先我们不去考虑64个盘子,我们来看一个盘子的情况

dad48b47ec8b4a1483c748905038d798.png

➡️直接挪(A------>C)只需要1次(2^1-1):

355c0156304c414fb0ad8ee7cc13aad0.png

2️⃣2个盘子

bc0592c1c1bd413cbc6cc235d54703a7.png

 ➡️A------>C       A------->B        B-------->C     只需要3次(2^2-1)

a89030147c1a4d1f9b8b1196a4b74df0.png

3️⃣3个盘子

49dc3371aeb049419ffbd01623fdcdb7.png

  ➡️A------>C       A------->B        C-------->B      A------>C       B------->A        B-------->C      A-------->C     只需要7次(2^3-1)

4aeebbd044e7483996cce56463bd3b06.png

7233963450184e6fa63fd0941e26dff0.png

4401f5d00a5b414f8a7e48191cba72f4.png

 👉总结

当有64个盘子时,需要挪动2^64-1,这是一个庞大的数字,这时候就需要我们使用计算机程序来实现这个数字。

当有n个盘子,现在想办法的是,把n-1个盘子放在B上,把第n个盘子放在C上,最后把n-1个盘子放在C上。

📝代码实现【java】

    //汉诺塔

    //一个盘子  A---->C    1
    //两个盘子  A---->B  A----->C   B---->C     3
    //三个盘子  A---->C  A----->B   C----->B      7     2^N - 1
    //64   2^64-1

    /*
     *
     * @param n
     * @param pos1   起始位置
     * @param pos2   中转位置
     * @param pos3   目的位置
     */

    public static void Hanoi(int n, char pos1, char pos2, char pos3) {
        if(n == 1) {
            move(pos1, pos3);
            return;
        }
        Hanoi(n-1, pos1, pos3, pos2);//n-1个盘子从pos1借助pos3移动到pos2中:pos1----->pos3
        move(pos1, pos3);//第n个盘子从挪到pos3中
        Hanoi(n-1, pos2, pos1, pos3);//n-1个盘子从pos2借助pos1到pos3中
    }

    public static void move(char pos1, char pos2) {
        System.out.print(pos1 + "->" + pos2 + " ");
    }

    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');

    }

73a0e006059c4f80a4dc3fc756130340.png

 

 

 

 

 

  • 21
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 14
    评论
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奋斗小温

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值