问题:对于A B C 三个塔,使盘子从A到C,并且保持大盘子在下小盘子在上,求移动多少次?
方法:递归解决
思考:1.对于1个盘子直接从A放到C。
2. 对于2个盘子,第一个先从A到B,然后第二个再从A到C,然后再让第一个从B到C。
3.对于A中n个盘子,前n-1个从A到B,然后第n个再从A到C;
对于B中n-1个盘子,前n-2个从B到A,然后第n-1个再从B到C;
…………然后递归ing…………
对于A中n-2个盘子…………
…………直到结束条件…………
对于A或B中1个盘子,直接从A或B到C。
(注意:类似于斐波拉奇数列,刚开始不用深究如何让n-1个盘子从A移动到B的,在一次一次向下迭代后,可以依次得到1、2、3……个盘子从一个塔移动到另一个塔的移动次数)
C语言代码表示:
#include<stdio.h>
int hrt(int n)
{
if (n == 1)
return 1;
else if (n <= 0)//当盘数<=0时,不需要移动
return 0;
else/*A->B移n-1个的次数+A->C移第n个+B->A移n-2个的移动次数+B->C移第n-1个*/
return hrt(n - 1) + 1 + hrt(n - 2) + 1;
}
int main()
{
int n;
scanf("%d", &n);
printf("%d", hrt(n));
return 0;
}