首页 > 其他分享 >汉诺塔问题

汉诺塔问题

时间:2024-04-27 14:55:50浏览次数:22  
标签:返回 调用 target 递归 hanoi 问题 source 汉诺塔

#include <iostream>

void hanoi(int n, char source, char target, char auxiliary) {
	if (n > 0) {
		// 将 n-1 个盘子从 source 移动到 auxiliary,使用 target 作为辅助
		hanoi(n - 1, source, auxiliary, target);
		// 将最大的盘子从 source 移动到 target
		std::cout << "Move disk " << n << " from " << source << " to " << target << std::endl;
		// 将 n-1 个盘子从 auxiliary 移动到 target,使用 source 作为辅助
		hanoi(n - 1, auxiliary, target, source);
	}
}

int main() {
	int n = 3; // 盘子数量
	hanoi(n, 'A', 'C', 'B'); // 从塔座A移动到塔座C,使用塔座B作为辅助
	return 0;
}

 递归栈的过程:

初始调用:
调用 hanoi(3, 'A', 'C', 'B'),将参数 n=3, source='A', target='C', auxiliary='B' 和函数返回地址压入栈中。
第一次递归调用:
在 hanoi(3, 'A', 'C', 'B') 函数内部,因为 n > 0,执行递归调用 hanoi(2, 'A', 'B', 'C')。
将参数 n=2, source='A', target='B', auxiliary='C' 和函数返回地址压入栈中。
第二次递归调用:
在 hanoi(2, 'A', 'B', 'C') 函数内部,再次因为 n > 0,执行递归调用 hanoi(1, 'A', 'C', 'B')。
将参数 n=1, source='A', target='C', auxiliary='B' 和函数返回地址压入栈中。
最底层递归调用:
在 hanoi(1, 'A', 'C', 'B') 函数内部,因为 n - 1 为 0,不再递归,直接执行打印操作 Move disk 1 from A to C。
函数执行完毕,弹出栈顶的 hanoi(1, 'A', 'C', 'B') 的相关信息,并返回到上一层调用。
返回到第二次递归调用:
继续执行 hanoi(2, 'A', 'B', 'C') 中剩余的操作,打印 Move disk 2 from A to B。
执行递归调用 hanoi(1, 'C', 'B', 'A')。
将参数 n=1, source='C', target='B', auxiliary='A' 和函数返回地址压入栈中。
再次最底层递归调用:
在 hanoi(1, 'C', 'B', 'A') 函数内部,直接执行打印操作 Move disk 1 from C to B。
函数执行完毕,弹出栈顶的 hanoi(1, 'C', 'B', 'A') 的相关信息,并返回到上一层调用。
返回到第一次递归调用:
继续执行 hanoi(2, 'A', 'B', 'C') 中剩余操作,打印 Move disk 1 from A to C。
函数执行完毕,弹出栈顶的 hanoi(2, 'A', 'B', 'C') 的相关信息,并返回到最初的调用。
返回到初始调用:
继续执行 hanoi(3, 'A', 'C', 'B') 中剩余操作,打印 Move disk 3 from A to C。
执行递归调用 hanoi(2, 'B', 'C', 'A')。
后续的递归调用与返回:
hanoi(2, 'B', 'C', 'A') 会继续递归调用 hanoi(1, ...) 和 hanoi(0, ...) 直到所有的盘子都被正确移动到目标塔座。
在这个过程中,每次递归调用都会将相关信息压入栈中,每次递归返回都会从栈中弹出相关信息。
最终结束:
当所有的递归调用都执行完毕并返回后,hanoi(3, 'A', 'C', 'B') 也执行完毕,栈中不再有任何关于这个递归过程的信息,程序结束。

标签:返回,调用,target,递归,hanoi,问题,source,汉诺塔
From: https://www.cnblogs.com/FJCLJ/p/18162048

相关文章

  • ROS学习--添加依赖相关问题
    在自定义话题接口时,步骤如下:新建msg文件夹,并在文件夹下新建xxx.msg在xxx.msg下编写消息内容并保存在CmakeLists.txt添加依赖和msg文件目录在package.xml中添加xxx.msg所需的依赖编译功能包即可生成python与c++头文件其中在CmakeLists.txt中添加依赖和msg文件目录时需要将......
  • 笔记本1050ti运行DLinear模型遇到的问题
    1、windows没法运行shgitbash可以,但我需要在conda环境中,使用sh运行脚本,所以应该在安装conda后,先配环境变量,然后在gitbash窗口中执行condainitbash,就可以用在bash窗口中通过condaactivate进入conda环境了。2、运行sh,报错加载不到模块看报错最后一行上面的模块,pipuninsta......
  • vue,js直接导出excel,xlsx的方法,XLSX_STYLE 行高设置失效的问题解决
    1、先安装依赖:xlsx、xlsx-style、file-saver三个包npminstallxlsxxlsx-stylefile-saver2、引入:<script>import*asXLSXfrom'xlsx/xlsx.mjs'importXLSX_STYLEfrom'xlsx-style';import{saveAs}from'file-saver';exportdefau......
  • 关于ida f5时报错lumina无法连接到云服务器的问题
    在用ida的时候不知道怎么回事突然就f5不了了,报错 Decompilationfailure:4005F7:cloud:ServerisnotavailablePleaserefertothemanualtofindappropriateactions lumina:connect:由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。4005F......
  • AssemblyResolve巧解未能加载文件或程序集“Newtonsoft.Json, Version=6.0.0.0的问题
    问题:未能加载文件或程序集“Newtonsoft.Json,Version=6.0.0.0,Culture=neutral,PublicKeyToken=30ad4fe6b2a6aeed”或它的某一个...问题分析:原因是因为引用的Microsoft.AspNet.SignalR.Client库的依赖项是6.0版本的Newtonsoft.Json,而且是动态加载进去的(用Assembly.LoadFrom),......
  • 谷歌 hackbar 不能使用的问题
    谷歌hackbar不能使用的问题下载hackbar插件:https://github.com/Mr-xn/hackbar2.1.3解压文件,将其拖入chrome扩展程序中点击详情,点击下面来源的链接 会跳转到插件的安装位置,进入theme/js文件,打开hackbar-panel.js文件,将以下三处disable_hackbar()函数替换成init(),并......
  • 清除SSL缓存的主要目的是确保系统使用最新的SSL证书信息,并解决与SSL证书相关的问题。
    通过以下方式实现:powershellCopyCode#清除SSL证书缓存Invoke-Expression-Command"certutil-urlcache*delete"这条命令将执行certutil-urlcache*delete命令,清除系统中的SSL证书缓存。请注意,您需要以管理员身份运行PowerShell才能执行此操作。命令行(CMD)批处......
  • Streamsets binlog采集时区问题
    在使用streamset采集binlog过程中,发现采集的datetime格式的数据他会转换为时间戳,但给的时间戳会有时区问题。通过百度查到前人解决方法:https://blog.csdn.net/weixin_38751513/article/details/131662819现详细记录解决过程:我们的streamsets是通过cdh部署的,第一步先找到streams......
  • Java并发01---JMM模型、Volatile、CAS操作、自旋锁、ABA问题
    @目录JMM(JavaMemoryModel)Volatile修饰CAS(CompareAndSwap)ABA问题JMM(JavaMemoryModel)首先要明确的是JMM与JVM内存结构不是同一个概念,记的时候不要记混。我们先来回顾一下JVM内存结构,其包括了堆、方法区、虚拟机栈、程序计数器、本地方法区,其中前二者为线程共享,后三者为线程......
  • mysql 数据库时区问题
    当数据库时区设置为国际时区时jdbc-url中添加以下配置serverTimezone=GMT%2B0Java服务中设置东八区TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));使用mybatis红的mapper.xml<resultMapid="BaseResultMap"type="cn.xs.qxj.mtk.pojo.XpCallInfo"......