汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。
大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。
并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。
问应该如何操作?
首先我们尝试一下集中可能:
n为圆盘个数,A是初始位置,B是中转位置,C为目标位置
n=1;执行的步骤有:A->C 1次
n=2;执行的步骤有:A->B A->C B->C 3次
n=3;执行的步骤有:A->C A->B C->B A->C B->A B->C A->C 7次
d我们可以简单的总结出一个公式:移动次数为2的n次方-1,那么关于这个传说我们可以假设每次挪动一次需要1秒,且移动没有错误,遵循规则的情况下,把64个盘从一个柱子移动到另一个柱子需要的时间是2^64-1秒
当转化为年时大约为是584 942 417 355年
可以看出其实这根本不是人力所能胜任的,假如说我们想用计算器实现过程,如果计算器为1.8HZ(处理能力),我们需要一台计算器不停的运转300年
所以这个问题的任务量还是非常之大的,回归这次的主题,如果用递归的办法应该怎么求汉诺塔问题。n=64我们暂且先不考虑,假设为n=2时,我们只需要三步,即使把小的移到B上,再把大的移到C上,再把小的从B移到C上,那么我们有一个非常重要的思想就是:当n=64时,我们把最大的看作为一个假设称为pos1,其他63个看作为一个假设称为pos2,那么我们实现的过程其实分为:
1.通过C这个中转位置,把pos2移动到B这个目标位置。
2.把pos1移动到C这个目标位置。
3.把pos2通过A这个目标位置移动到C。
通过这三步我们已经完成了要求,只不过没有把63个细致的展开而已,如果要展开,思想也是一样。其实我们已经发现了我们的递归条件,上代码
java汉诺塔问题(递归求解)
最新推荐文章于 2023-07-19 11:49:30 发布
汉诺塔问题是一个经典的递归问题,涉及将圆盘从一个柱子移动到另一个柱子,遵循不能放大圆盘到小圆盘上的规则。本文介绍了如何用递归方法解决该问题,并给出了n=2时的移动步骤。通过分解问题,将最大圆盘和剩余圆盘分别视为独立部分,借助中转柱,可以实现整个过程。文中提供了递归条件,并演示了n=1,2,3,4的情况,但由于问题规模巨大,无法实际测试n=64的情况。"
124332920,8189442,Spring Cloud Alibaba Nacos与Sentinel实战解析,"['微服务', 'springcloud', 'Nacos', 'Sentinel', '配置管理']
摘要由CSDN通过智能技术生成