OOP00-递归函数-汉诺塔(Tower of Hanoi)问题
思路
找到规律, 化繁为简, 分而治之.
问题描述
- 基本情况
汉诺塔有3个柱子, 分别为pillar1, pillar2, pillar3.
在柱子上套着大小不一的盘子, 用数字1,2,3等表示盘子的大小, 数字大的盘子大. - 约束条件
小的盘子只能套在大的盘子的上面. - 初始状态
开始状态是所有的盘子都套在柱子pillar1上, 这里假设有6个盘子(只是为了降低输出结果的数量, 原始的故事中有64个盘子). - 目标状态
目标状态是所有的盘子都套在柱子pillar3上. - 动作约束
每次只能移动一个柱子的最上面的1个盘子到另一个柱子. - 可用资源
可以用pillar2作为中转站. 没有其他可暂存的空间. - 需要回答的疑问
描述移动盘子的过程和需要的移动次数.
问题分析
从小规模的问题开始, 逐渐增加问题的规模.
从人工完成问题的求解开始, 找到规律后, 再用程序自动化完成问题求解.
下面的结果示例中, 表示盘子的数字序列的左侧表示柱子的底部, 例如pillar1: [3, 2, 1].
1个盘子, 移动1次完成
pillar1: [1] pillar2: [] pillar3: []
pillar1: [] pillar2: [] pillar3: [1]
2个盘子,移动3次完成.
pillar1: [2, 1] pillar2: [] pillar3: []
pillar1: [2] pillar2: [1] pillar3: []
pillar1: [] pillar2: [1] pillar3: [2]
pillar1: [] pillar2: [] pillar3: [2, 1]
3个盘子,移动7次完成
pillar1: [3, 2, 1] pillar2: [] pillar3: []
pillar1: [3, 2] pillar2: [] pillar3: [1]
pillar1: [3] pillar2: [2] pillar3: [1]
pillar1: [3] pillar2: [2, 1] pillar3: []
pillar1: [] pillar2: [2, 1] pillar3: [3]
pillar1: [1] pillar2: [2] pillar3: [3]
pillar1: [1] pillar2: [] pillar3: [3, 2]
pillar1: [] pillar2: [] pillar3: [3, 2, 1]
4个盘子, 移动15次完成
pillarFrom: [4, 3, 2, 1] pillarB: [] pillarTo: []
pillarFrom: [4, 3, 2] pillarB: [1] pillarTo: []
pillarFrom: [4, 3] pillarB: [1] pillarTo: [2]