首页 > 其他分享 >[数据结构学习笔记15] 汉诺塔(Towers of Hanoi)

[数据结构学习笔记15] 汉诺塔(Towers of Hanoi)

时间:2025-01-17 23:32:01浏览次数:1  
标签:Move 15 Towers destination hanoi 汉诺塔 temporary disk starting

汉诺塔是个古老的游戏,它可以用递归来解决。

 关于汉诺塔的玩法和介绍,请参考这里

算法思想:

1. 目标是把最底下,最大的盘从起始柱子移到终点柱子

2. 那我们要先把除了最大的盘的其他盘子从起始柱子移到临时柱子上

3. 然后把最大的盘子从起始柱子移到终点柱子

4. 把除了最大盘的其他盘子从临时柱子移到终点柱子

算法表示:

1. 把top N-1的盘子从开始柱子移到临时柱子

2. 把第N个盘子从开始柱子移到终点柱子

3. 把N-1个盘子从临时柱子移到终点柱子

这个有个要注意的是,在玩的过程中,起始柱子,临时柱子,终点柱子可能都会变化。

代码实现(javascript)

var numberOfDisks = 3;

var hanoi = function (n, a, b, c) {
  if (n > 0) {
       hanoi(n - 1, a, c, b);
       console.log("Move disk " + n + " from " + a + " to " + c + "!");
       hanoi(n - 1, b, a, c);
    }  
}

hanoi(numberOfDisks, "starting", "temporary", "destination");

代码运行结果:

Move disk 1 from starting to destination!

Move disk 2 from starting to temporary!

Move disk 1 from destination to temporary!

Move dist 3 from starting to destination!

Move disk 1 from temporary to starting!

Move disk 2 from temporary to destination!

Move disk 1 from starting to destination!

代码运行过程:

hanoi(3, starting, temporary, destination)
       hanoi(2, starting, destination, temporary)
              hanoi(1, starting, temporary, destination)
                      hanoi(0, starting, destination, temporary)
                      // Move disk 1 from starting to destination!
                      hanoi(0, temporary, starting, destination)


                 // Move disk 2 from starting to temporary!
                 hanoi(1, destination, starting, temporary)
                       hanoi(0, destination, temprary, starting)
                       // Move disk 1 from destination to temporary!
                       hanoi(0, starting, destination, temporary)

                // Move disk 3 from starting to destination!
                hanoi(2, temporary, starting, destination)
                      hanoi(1, temporary, destination, starting)
                      // Move disk 1 from temporary to starting!
                      hanoi(0, destination, temporary, starting)

                    // Move disk 2 from temporary to destination!
                    hanoi(1, starting, temporary, destination)
                          hanoi(0, starting, destination, temporary)
                           // Move disk 1 from starting to destination!
                           hanoi(0, temporary, starting, destination)

可以看到移到汉诺塔是需要反复递归执行的。传说和尚移动的汉诺塔是有64层的。如果要移动64层要移动多少次呢?答案是2^64 - 1次!加入移动一次要花1秒,那么移动64层需要花18,446,744,073,709,551,615秒,大概是5850亿年!

标签:Move,15,Towers,destination,hanoi,汉诺塔,temporary,disk,starting
From: https://www.cnblogs.com/Eagle6970/p/18677598

相关文章

  • Android 15应用适配指南:所有应用的行为变更
    Android系统版本适配,一直是影响App上架GooglePlay非常重要的因素。当前GooglePlay政策规定新应用和应用更新必须以Android14(API级别34)为目标平台,才能提交到GooglePlay。现有应用必须以Android13(API级别33)或更高版本为目标平台,GooglePlay才会在新用户的设......
  • 极空间使用clouddrive2 docker挂载115(SSH版)
    极空间开通SSH了,因此可以用clouddrive2将115挂载到极空间并在“个人空间”中看到了。按照官方教程,用docker-compose或者dockercli命令进行部署即可。具体部署步骤极空间打开SSH(系统设置-远程协助/SSH)。使用SSH工具如XTerminal等进入SSH,端口为开启SSH时设置的端口,账号密码为......
  • 极空间使用clouddrive2 docker挂载115(SSH版)
    极空间开通SSH了,因此可以用clouddrive2将115挂载到极空间并在“个人空间”中看到了。按照官方教程,用docker-compose或者dockercli命令进行部署即可。具体部署步骤极空间打开SSH(系统设置-远程协助/SSH)。使用SSH工具如XTerminal等进入SSH,端口为开启SSH时设置的端口,账号密码为......
  • 域密码到期发送提醒邮件的超简单方法.210715
    1,AD服务器下载安装免费的卓豪AD管理工具   https://www.manageengine.cn/products/self-service-password/free-password-expiry-notification-tool.html2,设置邮箱3,设置提醒邮件内容,选择域4,愉快的玩耍吧。......
  • 如何每5分钟、10分钟或15分钟运行一次Cron计划任务
    Crontab的语法和操作符Crontab(cron表)是一个定义cron作业时间表的文本文件。Crontab文件可以用crontab命令来创建、查看、修改和删除。用户crontab文件中的每一行都包含六个字段,用空格隔开,后面是要运行的命令。*****command(s)^^^^^|||||allowedvalues......
  • 15个系统设计权衡关键点:构建高性能系统的黄金法则
    在系统设计中,性能是一个关键的考量因素,尤其是在面对大规模用户、复杂业务需求或高吞吐量的场景时。以下是构建高性能系统时,15个常见的设计权衡关键点,这些法则帮助架构师做出合理的决策,从而打造出高效、可扩展的系统:###1.**横向扩展vs.纵向扩展**  -**横向扩展**(Scale......
  • 洛谷题单指南-线段树的进阶用法-P3168 [CQOI2015] 任务查询系统
    原题链接:https://www.luogu.com.cn/problem/P3168题意解读:一个任务管理系统,能够查询在某个时间点运行的任务中优先级最小的k个任务的优先级之和。解题思路:由于总时间n不超过100000,考虑针对所有时刻建立可持久化线段树,根节点为root[i]的线段树维护时刻i的任务情况,节点区间表示......
  • 2025.1.15——1200
    2025.1.15——1200Q1.1200简单来说就是给定3个数组,每个数组选择一个数,三者下标不同,问三者和的最大值。Winterholidaysarecomingup.Theyaregoingtolastfor\(n\)days.Duringtheholidays,Monocarpwantstotryalloftheseactivitiesexactlyoncewithhis......
  • 2025.1.15——1200
    2025.1.15——1200Q1.1200简单来说就是给定3个数组,每个数组选择一个数,三者下标不同,问三者和的最大值。Winterholidaysarecomingup.Theyaregoingtolastfornn......
  • 【2025-01-15】成人孤独
    20:00我们的弱点也许会给我们提供一种出乎意料的助力。                                                 ——威廉·詹姆斯何太昨晚躺在床上刷着淘宝跟起说,现在买东西......