以递归实现汉诺塔的思路

想要用C语言中的函数递归实现汉诺塔,首先要清楚汉诺塔中的圆盘是如何移动的。

以两个盘子举例,要将第二个盘子移到C柱则要先将第一个盘子移到B柱,在将第二个盘子移到C柱,再将第一个盘子移到C柱。

由特殊归纳到一般就是要先将第n-1个盘子移到B柱,再将第n个盘子移到C柱,最后将第n-1个盘子移到C柱,而接下来就是同样的步骤,只不过为了将第n-1个盘子移动到B柱,先要将第n-2个盘子移动到C柱。由此很容易就可以看出要用递归的方法解决这个问题。用符号表示为:

n-1-->B ;n-->C; n-1-->C。

然后我们可以尝试用代码的方式表示。首先写出一个主函数,要可以取数据得知有几个盘子,并调用说明如何移动盘子的函数。主函数如下

int main()
{
    int n=0;
    printf("A柱子上的盘子个数:");
    scanf("%d", &n);
    Hanoi(n, 'A', 'B', 'C',);
    return 0;
}

将三个塔的名称和盘子个数的数据给Hanoi函数后,要开始写这个函数了。首先,考虑特殊情况,也就是只有一个盘子时,直接将盘子移动到C柱子即可,之后,根据上面对汉诺塔运行原理的推理,运用递归写出先将第n-1个盘子移到B,也就是Hanoi(n-1 ,A , C ,B);之后就可以移动第n个盘子了,可以用一个函数打印盘子移动情况,move(n , A , C);最后将第n-1个盘子移到C柱就可以了,代码如下:Hanoi(n-1, B, A, C);由于这两个函数不需要返回值,用void即可,再加上主函数,整体代码如下:

void move(int n, char A, char C)
{
    printf("把第%d个圆盘从%c--->%c\n", n, A, C);
}

void Hanoi(int n, char A, char B, char C,)
{
    if (n == 1)
        move(n, A, C);
    else
    {
        Hanoi(n - 1, A, C, B);
        move(n, A, C);
        Hanoi(n-1, B, A, C);
    }

}

 int main()
{
    int n=0;
    printf("A柱子上的盘子个数:");
    scanf("%d", &n);
    Hanoi(n, 'A', 'B', 'C',);
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值