给定三根柱子,记为 A、B 和 C 。起始状态下,柱子 A 上套着 𝑛 个圆盘,它们从上到下按照从小到大的 顺序排列。我们的任务是要把这 𝑛 个圆盘移到柱子 C 上,并保持它们的原有顺序不变。在移动圆盘的过程中,需要遵守以下规则。
- 每次只能移动一个圆盘。
- 小圆盘必须时刻位于大圆盘之上。
1个圆盘
解:1个圆盘时,直接将圆盘从A移动到C。
2个圆盘
解:2各圆盘时问题也比较简单。我们可以先将小圆盘从A移动到B,将大圆盘从A移动到C,再将小圆盘从B移动至C。
3个圆盘
将3个移动圆盘的问题拆分为,
- 先移动2个圆盘
- 再移动一个圆盘
- 最后移动两个圆盘
即3个圆盘的问题拆解后就转换为2次移动2个圆盘,1次移动一个圆盘的问题。以此类推,n个圆盘的问题就可以转话为,2次移动n-1个圆盘,1次移动一个圆盘的问题。
n个圆盘
扩展:
n个圆盘 最少需要移动几次?
由于f(n)=2f(n-1)+1,则有
f(1)=1;
f(2)=3;
f(3)=7;
f(4)=15;
int moveTimes(int n){
if(n==1){
return 1;
}
return 2*moveTimes(n-1)+1;
}