C递归解简单汉诺塔

递归的思想在解小规模问题时可以写出优雅易懂的解法。
怎么进行递归的设计,以前看到过一本书上讲,递归的精粹是相信它能做到你让他做的事。

#include<stdio.h>
int move(int n, char left, char mid, char right);
int main()
{
    int n;
    scanf("%d", &n);
    move(n, 'a', 'b', 'c');
    return 0;
}
int move(int n, char left, char mid, char right)
{
    if(n == 1)
    {
        printf("%c->%c\n", left, right);
        return 0;
    }
    move(n-1, left, right, mid);
    move(1, left, mid, right);
    move(n-1, mid, left, right);
    return 0;
}

这个函数move就是用来的递归的,它能做到的是把n层碟子从参数left通过mid移到right,并打印出移动的过程。
首先,给它一个处理的最简单事件,移动一层,也就是很简单的从left->right

    if(n == 1)
    {
        printf("%c->%c\n", left, right);
        return 0;
    }

然后,三个move,模拟的是最顶层n-1层和剩下1层碟片移动
第一个move指的是把上面n-1层移动到中间,
第二个move指的是把最下面一层移动到右面
最后,把在中间的n-1层移动到右面。
这是模仿的两层碟片的移动,不同的是把n-1层看成了一个整体,相信move n-1层时能正确做到,逻辑上就完成了整个过程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值