C语言之利用函数递归解决汉诺塔问题

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆A,B,C,在A杆自下而上、由大到小按顺序放置64个金盘(如图1)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。                                                                                        操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

那么我们该如何利用函数递归思想来思考这个问题呢,不妨从最简单的两层开始思考,如图

 由B,C等价我们不妨将顶层1号放入B,再将底层2号放入C,最后将1放在2上面,需要三步,这样我们便知道了将两层从一个柱子移向另一个柱子的次数再来看看三层汉诺塔的解决方法

 我们可以将上面两层看作前面那个问题里的1号,底层依然看作2号,我们将顶层整体1号放入B,再将底层2号放入C,最后将1放在2上面,这样就完成了,但是上面两层不能同时移动,该怎么办呢?没关系,我们之前已经知道了将两层从一个柱子移向另一个柱子的方法,整体1号总共两层,移动了两层(A到B和B到C),底层2号只移动了一次(A到C),总次数就是2*3+1=7次,同理,面对四层汉诺塔,我们只需要将上面三层看作整体从而转化成二层汉诺塔来解决,有了这个思想,面对N层汉诺塔时我们只需要将上面N-1层看作整体,若移动N层汉诺塔需要的次数记作P(N),那么P(N)=2P(N-1)+1,思路已经很清晰,让我们将其写成一个程序

int Cal(int n)//计算次数的函数Cal()
{
    if (n >= 2)
    {
        return 2*Cal(n - 1) + 1;
    }
    else
    {
        return 1;
    }
}
int main()
{
    int a = 0;
    scanf("%d", &a);
    printf("%d",Cal(a));
    return 0;
}

问题便得到解决

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值