杭电2064--汉诺塔III

最近比较低迷,做点小题找找自信。递归一遍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数一样来个循环效率也会改进,只不过空间开销会大一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值