通过“汉诺塔”理解函数递归

先说汉诺塔游戏:有三根柱子,在其中一根柱子按照上小下大的顺序依次摆放N个圆盘,规定一次一个圆盘,并且小的只能在大的圆盘上面,把柱子上的所有圆盘转移到另一根柱子上。需要多少步数。

1.找规律  

从1个圆盘,开始

 

 

2个圆盘

 

3个圆盘

 

总结:通过3个圆盘的分解可看出:

1)是把前两个圆盘与第三圆盘分开(步骤3)

2)把第三个圆盘移到目标柱子

3)把分开的两个圆盘在依次移动到目标柱子

而在1)中把两个圆盘与第三个分开,相当于两个圆盘移动到目标柱子;3)中把两个圆盘依次移动到目标柱子,亦相当于两个圆盘移动到目标柱子;所以三个圆盘的移动相当于2次两个圆盘的移动加一次:a(3)=a(2)+a(2)+1

类比4个圆盘,规律一致,具体不在分析。

继续归纳:每次都是先将其他圆盘移动到辅助柱子上,并将最底下的圆盘移到c柱子上,然后再把原先的柱子作为辅助柱子,并重复此过程。

则n个圆盘:a(n)=a(n-1)+1+a(n-1)

int hut(int x)
{
    if (x > 1)
        return 2 * hut(x - 1) + 1;
    else
        return 1;
}

int main()
{
    int n = 0;
    int ret = 0;
    scanf("%d", &n);
    ret = hut(n);
    printf("ret=%d\n", ret);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值