经典递归应用--汉诺塔(C语言版)

本文介绍了一段使用C语言实现的汉诺塔问题代码,详细阐述了汉诺塔的基本原理和递归算法的具体实现步骤,包括如何通过递归函数完成n个盘子的移动过程,并计算总的移动步数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

经典递归应用--汉诺塔(C语言版)

//hanoi.c

//汉诺塔源码
//原理:
//移动n个盘子要经历(2的n次方-1)步。具体实现步骤是:1、将A上(n-1)个盘借助于C先移动到B座上;2、将A剩下的一个盘移动到C上;3、将(n-1)个盘从B借助于A移动到C上。

#include <stdio.h>

int count = 0;

//////////////////////////////////////////////////////////
//函数名:move
//功能:打印出x-->y,也就是具体的移动方法,并且计算总的移动步数
//入口参数:x-代表第一个座
//        y-代表第二个座
//////////////////////////////////////////////////////////
void move(char x,char y)
{
   printf("\t%c-->%c",x,y);
   count++;
}

//////////////////////////////////////////////////////////
//函数名:hanoi
//功能:将n个盘从one座借助于two座,移动到three座
//入口参数:n-代表总的盘数
//        one-代表第一个座
//        two-代表第二个座
//        three-代表第三个座
//////////////////////////////////////////////////////////
void hanoi(int n,char one,char two,char three)
{
   if(n == 1)   //如果只有一个盘,直接从one到three
      move(one,three);
   else  //如果有多个1个盘
      {
         hanoi(n - 1,one,three,two);) //第一步:将n-1个盘从one借助three移到two
         move(one,three);   //第二步:将第n个盘从one移到three
         hanoi(n - 1,two,one,three);//第三步:将n-1个盘从two借助one移到three
      }
}

//////////////////////////////////////////////////////////
//函数名:main
//功能:总的控制,打印出移动方案和移动次数
//入口参数:无
//////////////////////////////////////////////////////////
int main()
{
   int m;
   printf("Input the number of disks:");
   scanf("%d",&m);  //输入盘的总数
   printf("The step to moving %3d disks:\n\n",m);
   hanoi(n,'a','b','c');  //打印出移动方案
   printf("\nThe total times of moving are %d.\n",count); //打印出移动次数
   return(0);
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值