当前位置: 首页 > java >正文

汉诺塔递归过程推导(详细+省流)

汉诺塔
本科就没看懂,总不能难我一辈子吧…
省流版
先简化问题,假设移动 n 个盘子到一根柱子上的过程为 f(n)

首先分析最简单的 f(1)

  • A --> C

再分析简单的 f(2)

  • A --> B
  • A --> C
  • B --> C

其中B --> C就是 f(1)的过程,只不过是把B换成了A
分析一下复杂的 f(3):

  • A --> C
  • A --> B
  • C --> B

发现上面是一个f(2)过程(移动2个盘到B)
然后:

  • f(1): A --> C

此时A的最底下那块盘已移动完,不再考虑,剩下一个f(2)过程
暂时不能往下分析了,因为我们发现已经不能简单的用f(n)描述过程了,使用参数列表: F(n, *L)表示:
重写上面的f(1)过程:
F(1, A, C)

  • A --> C

重写上面的f(2)过程:
F(2, A, B, C)(通过B将2个盘从A移动到C):

  • F(1, A, B)
  • F(1, A, C)
  • F(1, B, C)

重写上面的f(3)过程:
F(3, A, B, C):

  • F(2, A, C,B)

A盘剩一个:

  • F(1, A, C)

将B盘的2个放过去:

  • F(2, B, A, C)

暂时没发现明显规律, 接着推f(4)过程:
F(4, A, B, C)
显然:

  • F(3, A, C, B)

此时A还剩最后一片:

  • F(1, A, C)

将B盘的3个放过去:

  • F(3, B, A, C)

这时, 我们发现规律: 将A的n-1个盘放到B, 再放最后一片到C, 接着把B当成A递归执行
总结成一般规律就是:
F(n, A, B, C):

  • F(n-1, A, C, B)
  • F(1, A, C)
  • F(n-1, B, A, C)

递归仍需要出口, 定义:
F(1, A, B, C)

  • F(1, A, C)

验证F(2, A, B, C)过程:

  • F(2-1, A, C, B)
    • F(1, A, B)
  • F(1, A, C)
  • F(2-1, B, A, C)
    • F(1, B, C)

与上面的分析过程一致. 至此, 递归函数已经推导出来了

http://www.xdnf.cn/news/20112.html

相关文章:

  • 2025 年高教社杯全国大学生数学建模竞赛A 题 烟幕干扰弹的投放策略完整成品 思路 模型 代码 结果 全网首发高质量!!!
  • 2025跨境独立站最新最完整的搭建流程
  • AI智汇社区凭什么半年估值破亿?这家公司让普通人也能玩转AI开发
  • 【IO】共享内存、信息量集
  • 【已更新文章+代码】2025数学建模国赛B题思路代码文章高教社杯全国大学生数学建模-碳化硅外延层厚度的确定
  • 《设计模式之禅》笔记摘录 - 19.备忘录模式
  • 新增MCP工具管理,AI对话节点新增工具设置,支持对接企业微信机器人,MaxKB v2.1.0版本发布
  • 理解进程栈内存的使用
  • 嵌入式第四十六天(51单片机)
  • git提交代码
  • React笔记_组件之间进行数据传递
  • 只会git push?——git团队协作进阶
  • RAG(检索增强生成)-篇一
  • Linux-xargs-seq-tr-uniq-sort
  • Oracle 数据库使用事务确保数据的安全
  • 实现自己的AI视频监控系统-第三章-信息的推送与共享4
  • 如何在SpringBoot项目中优雅的连接多台Redis
  • vue3的 三种插槽 匿名插槽,具名插槽,作用域插槽
  • 无需Python:Shell脚本如何成为你的自动化爬虫引擎?
  • Dubbo消费者无法找到提供者问题分析和处理
  • 记录SSL部署,链路不完整问题
  • Eclipse 常用搜索功能汇总
  • 连接MCP,Lighthouse MCP Server和CNB MCP Server应用
  • 解密注意力计算的并行机制:从多头并张量操作到CUDA内核优化
  • 25年Docker镜像无法下载的四种对策
  • 【Spring Cloud Alibaba】Sentinel(一)
  • 【LeetCode数据结构】设计循环队列
  • Java 并发编程解析:死锁成因、可重入锁与解决方案
  • 人工智能机器学习——逻辑回归
  • go 初始化组件最佳实践