经典递归应用--汉诺塔(C语言版)
2012-09-04 23:23
281 查看
经典递归应用--汉诺塔(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);
}
相关文章推荐
- 经典递归应用--汉诺塔(Java语言版)
- 递归的经典应用----汉诺塔问题
- 递归的经典应用----汉诺塔问题
- 经典递归应用--汉诺塔(C#语言版)
- 汉诺塔(河内塔问题)-----递归应用
- 经典递归解决汉诺塔
- 对 汉诺塔 经典递归的反思
- 递归和分治思想的典型应用—汉诺塔问题
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
- 数据结构之栈与递归的应用(汉诺塔递归解法)
- 经典递归解决汉诺塔问题 python实现
- [置顶] 算法设计方法:递归的内涵与经典应用
- 从汉诺塔问题看 函数尾部递归的消除 (C语言版)
- 汉诺塔递归解决方法经典分析
- 递归的一些经典应用
- 汉诺塔--递归经典
- 递归经典算法 汉诺塔问题
- 经典递归解决汉诺塔!
- 经典递归解决汉诺塔!
- 两个经典递归问题:菲波那契数列 + 汉诺塔