编程训练——最经典的递归题:汉诺塔

汉诺塔的代码当然是要背诵的。

【题目描述】
输入n,代表有n个圆盘。共有a,b,c三个杆子,输出结果表示如何移动圆盘,完成汉诺塔的求解。

【示例代码】
算法描述见注释。

令人费解的事情:9~11行和13~15行长得一样对吧?但是9~11行会报错Expected expression。至今我未发现有什么不同,也许是xcode的bug?

//
//  算法描述:先将1~n-1号从a移动到b,然后将n号从a移动到c,然后将1~n号从b移动到c
//

#include<stdio.h>

#define MAX_N 20

//void Move(int n,char a,char b){ //将n号圆盘从a移动到b   //Expected expression
//    printf("编号为%d的盘子:%c==>%c\n",n,a,b);
//}

void Move(int n,char a,char b){ //将n号圆盘从a移动到b
    printf("编号为%d的盘子:%c==>%c\n",n,a,b);
}

void Hanoi(int n,char a,char b,char c){ //将1~n号圆盘从a杆移动到c杆,b杆为辅助
    if(n>0){    //限定递归边界
        Hanoi(n-1,a,c,b);   //先将1~n-1号圆盘从a移动到b
        Move(n,a,c);    //将n号从a移动到c
        Hanoi(n-1,b,a,c);   //将1~n-1号从b移动到c
    }
}

int main(){
    int n;
    while(scanf("%d",&n)==1){
        Hanoi(n,'a','b','c');   //注意不要将'a','b','c'写成a,b,c
    }
    
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值