汉诺塔(Java)
1.问题描述有a,b,c三个柱子现有n个圆盘在a柱上且下面的圆盘始终比上面的圆盘大现只能从上面取出圆盘且每次只能取出一个圆盘必须时刻保证下面的圆盘比上面的大2.解决方式递归求解代码package recursionHannuoTa; import java.util.LinkedList; public class Test { // 汉诺塔问题 private static LinkedListInteger a new LinkedList(); private static LinkedListInteger b new LinkedList(); private static LinkedListInteger c new LinkedList(); private static void print(){ System.out.println(); System.out.println(a); System.out.println(b); System.out.println(c); } private static void move(int n, LinkedListInteger src, LinkedListInteger temp, LinkedListInteger des){ if(n 0){ return; // 退出递归 } move(n - 1, src, des, temp); // n-1个圆盘从a柱借助c柱移动到b柱 des.addLast(src.removeLast()); // 将最后一个圆盘移动到c柱 print(); move(n - 1, temp, src, des); // n-1个圆盘从b柱借助a柱移动到c柱 } public static void main(String[] args) { int n 3; for (int i n; i 0 ; i--) { a.addLast(i); } print(); move(3, a, b, c); } }伪代码以三为例 1 move(int 3, src, borrow, des){ 2 move(2, src, des, borrow);{ 3 move(1, src, des, borrow);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 3 print(a, b, c); [3, 2] [] [1] move(0, borrow, src, des); return; } 标记 des.addLast(src.removeLast()); 2 print(a, b, c); [3] [2] [1] 4 move(1, borrow, src, des);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 4 print(a, b, c); [3] [2, 1] [] move(0, borrow, src, des); return; } } 标记 des.addLast(src.removeLast()); 1 print(a, b, c); [] [2, 1] [3] 5 move(2, borrow, src, des);{ 6 move(1, src, des, borrow);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 6 print(a, b, c); [1] [2] [3] move(0, borrow, src, des); return; 标记 des.addLast(src.removeLast()); 5 print(a, b, c); [1] [] [3, 2] 7 move(1, borrow, src, des);{ move(0, src, des, borrow); return; 标记 des.addLast(src.removeLast()); 7 print(a, b, c); [] [] [3, 2, 1] move(0, borrow, src, des); return; } }每一次打印对应的头部move用数字标记了可以看出move(n - 1, src, des, temp);在这行代码递归的时间里他的作用是将a柱中n-1个圆盘摆在b柱上且符合下圆盘大上圆盘小des.addLast(src.removeLast());这行代码的最外层调用也就是第一次执行这个方法时的那行代码一直等到上面的递归结束后执行作用是将最后一个圆盘移动到c柱move(n - 1, temp, src, des);这段递归调用是将b柱的圆盘移动到c柱上且符合下圆盘大上圆盘小最后说一下为什么会符合下圆盘大上圆盘小--从伪代码可以看出每两次 move(n - 1, src, des, temp);后有一次move(n - 1, temp, src, des);而这其中的des.addLast(src.removeLast());所对应的a,b,c柱是不同的temp就是borrow--从我每次打印所标记对应的数字可以看到每三次是一次动作循环前两次是将圆盘分散这个时候的移动是为最后一次做铺垫确保了最后能将一个小圆盘移到仅比他大一位的圆盘上--中间将最后一个圆盘移动到c柱这个操作不参与以上三次循环3.总结伪代码着实给我看了好一会我讲的确实不是很清楚我着实不擅长处理这种变来变去过程又复杂的东西实在不好推敲对于代码的理解我是找到规律然后在大脑中推敲最后再写一遍代码这个属实是给我CPU干烧了要说代码的理解也不复杂就是三步1.将a柱中n-1个圆盘摆在b柱上2.将最后一个圆盘移动到c柱3.将b柱的圆盘移动到c柱上。但这其中传给函数方法的参数不断变化实在不好在大脑推敲所以我不敢说懂了这段代码但也算记了下来以上是我写了伪代码之后得出的一些结论汉诺塔就到次为止吧各位加油。汉诺塔时间复杂度2^n

相关新闻

MyBatis插入员工密码为空?SQL语句多写字段导致默认值失效

MyBatis插入员工密码为空?SQL语句多写字段导致默认值失效

【避坑指南】MyBatis插入员工密码为空?一个字段引发的困惑!关键词:MyBatis插入密码为空、数据库默认值被覆盖、SQL字段冗余、后端开发避坑 适用人群:Java后端开发者、MyBatis使用者、正在被“神秘空值”困扰的你 阅读时间&#xf…

2026/7/3 23:40:58 阅读更多 →
国产化编辑器怎样兼容CKEditor的Ctrl+V粘贴图片功能?

国产化编辑器怎样兼容CKEditor的Ctrl+V粘贴图片功能?

震惊!.NET程序员接了个CMS项目,结果客户要求比登天还难! 兄弟们好!我是一名在西安搬砖的.NET程序员,最近接了个企业官网CMS的外包项目,本来以为就是改改新闻发布模块的小活儿,结果客户给我来了…

2026/7/4 10:37:06 阅读更多 →
Linux系统中,ls可能是你每天敲得最多的命令之一,但是用好的人没几个

Linux系统中,ls可能是你每天敲得最多的命令之一,但是用好的人没几个

在Linux世界里,ls 可能是你每天敲得最多的命令之一。很多人以为它就只是“列出文件”,简单粗暴。但其实,这个看似基础的命令藏着无数“隐藏”功能,只要掌握几个关键选项,就能从新手秒变终端老司机,让文件管理、磁盘排查、权限审计效率暴涨。 今天这篇文字,就带你挖掘 l…

2026/7/3 23:47:19 阅读更多 →

最新新闻

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比

AI工具链选型:GitHub Copilot与Cursor、Codeium企业开发场景实测对比 一、评测体系设计与方法论 AI编码助手已成为开发效率的关键杠杆。本次评测聚焦三项主流工具的实际表现。从四个维度建立可复现的量化评测框架。 %%{init: {theme: base}}%% radartitle AI编码助手…

2026/7/5 1:20:14 阅读更多 →
PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader

PyTorch 数据加载瓶颈:GPU 空等时先看 DataLoader 一、训练慢不一定是模型慢 PyTorch 训练时,很多人看到速度慢就先改模型、调 batch size、换显卡。但如果 GPU 利用率忽高忽低,可能瓶颈根本不在模型,而在数据加载。图片解码、文本…

2026/7/5 1:20:14 阅读更多 →
群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能

群晖DSM 7.2.2视频管理终极解决方案:免费恢复Video Station完整功能 【免费下载链接】Video_Station_for_DSM_722 Script to install Video Station in DSM 7.2.2 and DSM 7.3 项目地址: https://gitcode.com/gh_mirrors/vi/Video_Station_for_DSM_722 你是否…

2026/7/5 1:20:14 阅读更多 →
云原生可观测性:构建全链路监控体系

云原生可观测性:构建全链路监控体系

引言在微服务架构和容器化部署成为主流的当下,系统的复杂性呈指数级增长。一个请求可能跨越数十个服务实例,传统的日志查看和单点监控已无法满足故障排查的需求。云原生可观测性(Observability)应运而生,它通过Metrics…

2026/7/5 1:18:13 阅读更多 →
工训赛智能小车 PCB 自制指南:从 BTN7971B 四路驱动到主控布局的 5 个要点

工训赛智能小车 PCB 自制指南:从 BTN7971B 四路驱动到主控布局的 5 个要点

工训赛智能小车PCB设计实战:从四路驱动到主控布局的进阶指南在工程训练综合能力竞赛的智能物流搬运赛项中,一辆性能卓越的小车往往始于精良的PCB设计。当现成模块难以满足定制化需求时,自主设计PCB不仅能显著降低成本,更能实现整车…

2026/7/5 1:18:13 阅读更多 →
FastAPI零基础教程(八)- 后台任务、WebSocket与高级特性,半天吃透进阶能力

FastAPI零基础教程(八)- 后台任务、WebSocket与高级特性,半天吃透进阶能力

文章目录前言一、阶段学习目标(半天速成)二、核心一:BackgroundTasks 后台任务(解耦耗时操作)2\.1 核心原理2\.2 基础实战:简单后台任务2\.3 多任务叠加 \ 异步任务支持2\.4 关键避坑点(生产必看…

2026/7/5 1:18:13 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻