具体数学 递归问题1.1 从河内塔/汉诺塔开始

本文介绍了河内塔问题及其递归解决方案,通过数学归纳法解析了时间复杂度为O(2^n)的递归关系,并提供了C++实现。文章强调递归在解决此类问题中的重要性,以及如何通过理解递归来深化对算法的理解。
摘要由CSDN通过智能技术生成

河内塔问题

在经典河内塔问题中,有3根柱子和N个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按从大到小依次套在一根柱子上,现在想将所有的圆盘按照原来的位置从一根柱子移动到另一根柱子上,移动过程需要遵守一些规则:
1.每次只能移动一个盘子
2.盘子只能从柱子顶端滑出移动到下一根柱子
3.盘子只能叠在没有盘子的柱子或者比它大的盘子上

聚焦河内塔问题。河内塔的规则,限定了较大的圆盘要先转移到目标柱子(选择的任意一根柱子)上,这时直接转移是不可行的,一定要利用其他柱子。问题中只有3根柱子,所以,另外一个柱子一定是要将N-1个圆盘按照从大到小堆起,(这个柱子我们叫它cache peg存放柱),这才使得最大圆盘可以直接从原来位置转移到目标位置。
并且,这种方案最优。因为在这个问题下,最大圆盘转移到目标柱子仅用一次是最少且必须的。
抽象一下算法,解决N个圆盘的移动,记 T n T_{n} Tn
(这里会用到记号,a small tips for algorithm to solve the questions)

  1. 将最上面的N-1个圆盘移动到cache peg,记为 T n − 1 T_{n-1} Tn1
  2. 可以拿出最大的圆盘,且仅能将圆盘从原柱子移动到目标柱子
  3. 将在cache peg上的N-1个圆盘最终都移动到目标柱子上,也是 T n − 1 T_{n-1} Tn1

分解成具体步骤后,可以发现移动的规律, T n T_{n} Tn被分解成2* T n − 1 T_{n-1} Tn1+1次移动了。河内塔问题完全是利用子问题解决原问题的策略,可以解决的数学问题。

这种通过子问题解决原问题,不断地向前推进,找到最小子问题的解,再回溯计算原问题的方法,被定义成递归,用递归解决问题的被定义为递归问题。

河内塔问题可以轻松利用递归解决,时间复杂度是O( 2 n 2^n 2n)。

回到数学

接下来用数学角度去看河内塔问题,旨在给出一种数学手段,解释一般递归问题有关时间复杂度的计算。读者可以酌情阅读,不影响对河内塔问题的理解。

河内塔问题是经典的N个圆盘移动的递归问题。因为三柱河内塔的 T n T_{n}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值