最近比较低迷,做点小题找找自信。递归一遍AC,重在找规律。
思路:
这道题画图求解再好不过了,拿两个盘子举例,两个盘子所需要移动的步骤:最下面最大的盘子先不动,上面的(n-1)个盘子先挪到最右边;最大的盘子向右挪一次;最右面的(n-1)个盘子挪到最左边;最大的盘子再向右挪一下到最右边;(n-1)个盘子从最左边挪到最右边。
假设n个盘子移动需要 f(n),那么f(n)=f(n-1)+1+f(n-1)+1+f(n-1),所以f(n)=3*f(n-1)+2;
代码:
#include<stdio.h>
#include<string.h>
long long hanoi(int n)
{
long long hano;
if(n==1) return 2;
return hano=hanoi(n-1)*3+2;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n>35||n<1) break;
printf("%lld\n",hanoi(n));
}
return 0;
}
我觉得如果写成递归函数,还可以加上自顶向下的动态规划,或者直接像求一般fib数一样来个循环效率也会改进,只不过空间开销会大一些。