汉诺塔

/**
汉诺塔的研究
A,B,C,将A上的盘子移到C上,规则不再多说
经典的递归:
确立目标:A上的盘子移动到C上
问题分解:1, A--->B(借助于C将A的n-1个盘子移动到B上) 2, B--->C(借助于A将B的n-1个盘子移动到C上)
递归的边界:A上的最后一个直接放到C上
*/

#include<stdio.h>
///目标:将n个盘子从x,借助y,移动到z
void move(int n, char x, char y, char z)
{
    if(n == 1)///递归边界:剩一个的时候直接放到 z 就可以了   这是对第n个盘子进行操作
    {
        printf("%c--->%c\n",x,z);
    }
    else
    {
        /**该函数到达边界后并没有完成将A上的盘子移动到
        B上,而是在回溯的过程中配合第二个递归调用才真正一步一步完成的
        塔的移动,只是问题可以这么分解,这是难点,很难理解,很难拿来使用
        */
        move(n-1, x, z, y);         ///问题分解1:将n-1个盘子从x借助z移动到y 
        printf("%c--->%c     %d\n",x,z,n);   ///将第n个盘子从x移动到z上
        move(n-1, y, x, z);         ///问题分解2:将n-1个盘子从y借助x移动到z
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    move(n, 'x', 'y', 'z');
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值