首页 > 其他分享 >递归【汉塔罗问题】

递归【汉塔罗问题】

时间:2024-07-12 12:54:38浏览次数:11  
标签:柱子 移动 递归 圆盘 塔罗 hanoi 问题 柱上

汉诺塔(Hanoi Tower)问题是一个著名的递归问题,最初由法国数学家Édouard Lucas在1883年发明。这个问题描述如下:
有三根柱子A、B、C,以及n个不同大小的圆盘,初始时所有的圆盘都按照从大到小的顺序放在柱子A上。目标是将所有圆盘移到柱子C上,同时遵循以下规则:
- 每次只能移动一个圆盘。
- 在任何时候,都不能将一个较大的圆盘放在一个较小的圆盘上面。

递归算法是解决汉诺塔问题的自然方式。

代码

def hanoi(n,A,B,C):#定义汉诺塔函数,参数n是圆盘数,A、B、C是3根柱
	if n==1:#判断圆盘数,如果等于1
		print(A,'-->',C,' ',n) # 直接将A柱上的圆盘移动到C柱上
	else:#否则,进行递归移动
		hanoi(n-1,A,C,B) #递归将A柱最上方的n-1个盘子落在B柱
		print(A,'-->',C,' ',n) # 输出将A柱上的圆盘移动到C柱上,也就是将A柱的最小面盘子落在C柱
		hanoi(n-1,B,A,C) #递归将B柱上的n-1个盘子,落在C柱

hanoi(3,'A','B','C')#调用函数

在这里插入图片描述

代码解释

函数hanoi(n, A, B, C)接受四个参数:

  • n:圆盘的数量。
  • A:起始柱子,初始时所有圆盘位于此柱子上。
  • B:辅助柱子,用于临时存放圆盘。
  • C:目标柱子,最终所有圆盘应位于此柱子上。

递归步骤:

  • 基本情况:如果只有一个圆盘(n == 1),则直接从柱子A移动到柱子C。
  • 递归情况:
    • 首先,递归地将n-1个圆盘从柱子A移动到柱子B,使用柱子C作为辅助柱子。这一步骤将除了底部最大的圆盘以外的所有圆盘移动到柱子B。
    • 接着,将底部最大的圆盘从柱子A直接移动到柱子C。
    • 最后,再递归地将n-1个圆盘从柱子B移动到柱子C,这次使用柱子A作为辅助柱子,完成整个过程。

调用函数:

hanoi(3, 'A', 'B', 'C')

这行代码调用了hanoi函数,尝试解决3个圆盘的汉诺塔问题,从柱子A开始,通过柱子B,目标是柱子C。

递归算法的优点是代码简洁且逻辑清晰,但缺点是在n较大时,计算量会呈指数级增长,可能会导致大量的函数调用,影响程序的执行效率和内存使用。

标签:柱子,移动,递归,圆盘,塔罗,hanoi,问题,柱上
From: https://blog.csdn.net/weixin_64534587/article/details/140376184

相关文章

  • 山东大学数据结构与算法课程设计实验4网络放大器设置问题
    问题描述 一个汽油传送网络可由加权有向无环图G表示。图中有一个称为源点的顶点S。从S出发,汽油被输送到图中的其他顶点。S的入度为0,每一条边上的权给出了它所连接的两点间的距离。通过网络输送汽油时,压力的损失是所走距离的函数。为了保证网络的正常运转,在网络传输中必须保......
  • Xamarin.Android -- EditText输入无法实时显示问题
    参考文章:EditText输入内容不显示_edittext输入没有显示-CSDN博客https://blog.csdn.net/guodashen007/article/details/108768508scrollview内嵌tablelayout布局,tablerow内嵌EditText,EditText输入后文字不显示,因为安卓9以上会出现不兼容问题,后在配置文件增加硬件加速属性解决。E......
  • Java中的递归算法详解
    Java中的递归算法详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!1.什么是递归算法?递归算法是指在函数的定义中使用函数自身调用的方法。在算法中,递归通常用于解决可以被拆分为相似子问题的问题,每个子问题都是原始问题的一部分。2.递归算法的基本......
  • PGSQL数据膨胀问题排查
    背景不知道从何时开始,数据库空载时的性能消耗越来越高,当业务高峰期,CPU和内存都处于高负载的情况下,观看AWS的监控,发现负载空载时占用很高。并且占用较高的Top5分为为:autovacuum:VACUUMANALYZEpg_catalog.pg_attributeautovacuum:VACUUMANALYZEpg_catalog.pg_typea......
  • cocos Buffer的问题
    结果问题:Nodejs直接用Buffer就可以了,但是cocos这边,不能直接用根据大大的方式:报没有默认导出,改了一下声明文件报这个错误:估计b没被正确解析又改了一下:然后还是有问题:打断点看看:变成了一个包含Buffer的对象,我需要的是Buffer就很奇怪:好像声明文件里的就是B......
  • 测试工程师面试热门问题(六)
    你了解持续集成(CI)和持续部署(CD)吗?请描述它们与测试的关系。持续集成(ContinuousIntegration,CI)和持续部署(ContinuousDeployment,CD)是现代软件开发中的重要概念,它们与测试的关系密不可分。以下是对这两个概念及其与测试关系的详细描述:一、持续集成(CI)定义:持续集成是一种......
  • 多线程中自定义线程池与shiro导致的权限错乱问题解决
    importorg.apache.shiro.SecurityUtils;importorg.apache.shiro.subject.Subject;importorg.apache.shiro.util.ThreadContext;importjava.util.concurrent.*;publicclassShiroAwareThreadPoolExecutorextendsThreadPoolExecutor{publicShiroAwareThread......
  • 服务器redhat5.8网络问题,如何解决
    ......
  • vulnhub靶机网卡配置问题
    vulnhub靶机网卡配置问题靶机来源——ICA-1vulnhub下载地址:https://www.vulnhub.com/entry/ica-1,748/描述:debian系统(linux)1.3GB下载的是OVA文件,导入虚拟机进行NAT网络配置,可以全局访问用kali攻击机arp-scan探测不到ip,应该是debian网卡配置问题,没有分配到ip正常......
  • C语言基础:函数的定义、调用和递归
    在C语言中,函数是一段完成特定任务的代码块,可以被多次调用和重复使用,有助于提高程序的模块化和可维护性。函数通过定义和调用来实现。函数的定义函数的定义包括函数的声明和函数体,其中函数的声明用于告诉编译器函数的名称、参数类型和返回类型,而函数体则包含了具体的实现......