汉诺塔问题笔记(Java实现)
汉诺塔问题笔记(Java实现) 前言 这两天在B站跟着小甲鱼学习递归的时候遇到了汉诺塔问题,乍一听没想明白,动手画了画才明白过来,因为本人递归学的不太好,为了加深印象,也为了验证自己是否真的明白了,决定写一个笔记记录一下。 B站小甲鱼传送门: 小甲鱼讲解数据结构和算法 p34 汉诺塔问题 问题描述 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。(来自百度百科) 现在抛开问题的背景,汉诺塔问题可以简单描述如下: 初始状态:有三根柱子,其中第一根柱子上堆放着任意数量(n)的圆盘,另外两根是空柱子。 圆盘在任意柱子上的摆放遵循以下原则:在上方的圆盘半径不能超过其下方的圆盘半径。(这里为了简化问题,可以给所有的圆盘编号,最大的圆盘编号最大 n,最小的圆盘编号最小 1,那么也就是说在任意一根柱子上,圆盘的编号必须从下往上依次减小) 目标:将所有的圆盘从一开始的柱子移动到第三根柱子上,在移动过程中和结束状态下圆盘的摆放都必须遵循 2 中的原则。 要求:列出完成目标所需要的所有步骤。 解析 汉诺塔问题是递归中的经典问题,这里也只介绍一下递归的解法。(以下的 n