首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C语言实现汉诺塔

C语言实现汉诺塔

作者头像
用户11367247
发布2024-11-20 14:44:18
发布2024-11-20 14:44:18
11600
代码可运行
举报
文章被收录于专栏:CodeCode
运行总次数:0
代码可运行

这是一个古典的数学问题,是一个只有用递归方法解决的问题。问题是这样的:古代有一个梵塔,塔内有3个座A,B,C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上。有一个老和尚想把这64个盘子从A座移到B座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用C座。要求编程打印出移动的步骤。

其目的是让A中的盘子通过C全部移动到B上面,A为起始,B为终止,C是中转。其中设计到了递归思想,首先写一段打印代码

代码语言:javascript
代码运行次数:0
运行
复制
void move(char pos1,char pos2)
{
    printf("%c->%c\n",pos1,pos2);
}

目的是等下在递归中频繁调用打印操作,从而建去了一系列的操作。

其次是实现核心代码,

代码语言:javascript
代码运行次数:0
运行
复制
void Hanoi(int n,char pos1,char pos2,char pos3)
{
    if(n==1)
    {
        move(pos1,pos2);
        
    }
    else
    {
        Hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos2);
        Hanoi(n-1,pos3,pos2,pos1);
    }
}

这里只针对汉诺塔进行分析,详细递归还需大家慢慢积累,

首先定义n个盘子,pos1为起止地,POS3为中转地,POS2为目标地,递归是有结束条件的,结束的条件就是最后一个盘子从起止地挪到目标地,用代码实现就是move(pos1,pos2),当n不等于1时,程序进入其他选项,根据顺序要把第一个盘子先挪到目标地,要挪到最底下的盘子就要先挪动上面的n-1个盘子,将他们从pos1起始挪到pos3中转,然后最低下的盘子可以从pos1挪到pos2了,就调用move这个函数,当把最底下的盘子挪了之后,就又要将序最底下序号n-1个盘子以pos3为起止,然后以pos1为中转,挪到到pos2目标,依次类推,一个汉诺塔的递归就实现了,最后是源代码。

代码语言:javascript
代码运行次数:0
运行
复制
#include<stdio.h>
void move(char pos1,char pos2)
{
    printf("%c->%c\n",pos1,pos2);
}
void Hanoi(int n,char pos1,char pos2,char pos3)
{
    if(n==1)
    {
        move(pos1,pos2);
        
    }
    else
    {
        Hanoi(n-1,pos1,pos3,pos2);
        move(pos1,pos2);
        Hanoi(n-1,pos3,pos2,pos1);
    }
}
int main()
{
    int a;
    scanf("%d",&a);
    Hanoi(a,'A','B','C');
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档