Hanoi塔问题(C语言程序)
实验二 HANOI塔问题

实验二递归程序设计一、实验目的1、理解PROLOG编制递归程序的方法:边界条件与递归部分的设计;2、熟悉运用递归分析、解决问题的方法。
二、实验内容及步骤(一)Hanoi塔问题:如上图,目的是把左边的所有盘子移到右边的杆子上。
一次只能移动一个盘子,可以使用中间的杆子作为临时存放盘子的地方。
在移动的过程中,小盘子必须放在大盘子之上。
分析:用递归来解决这个问题。
如果只有一个盘子,直接移过去就行了,这是递归的边界条件。
如果要移动N个盘子,就要分三步走:1、把N-1个盘子移动到中间的杆子上(把右边的杆子作为临时存放盘子的位置)2、把最后一个盘子直接移到右边的杆子上。
3、最后把中间杆子上的盘子移到右边的杆子上(把左边的杆子作为临时存放盘子的位置)。
上面第一、三步用到了递归。
我们看到,通过递归把N个盘子的问题变成了两个N-1个盘子的问题。
如此下去,最后就变成了2个一个盘子的问题了,这也就是说问题被解决了。
1)Hanoi塔的Prolog代码:hanoi(N):-move(N,left,middle,right).move(1,A,_,C):-inform(A,C),!.{!为cut操作,截断进一步搜索}move(N,A,B,C):-N1is N-1,move(N1,A,C,B),inform(A,C),move(N1,B,A,C).inform(Loc1,Loc2):-nl,write(“Move a disk from”Loc1“to”Loc2).?-hanoi(3).主程序为hanoi,它的参数为盘子的数目。
它调用递归谓词move来完成任务。
三个杆子的名字分别为left、middle、right。
第一个move子句是边界情况,即只有一个盘子时,直接调用inform显示移动盘子的方法。
后面使用cut,是因为:如果只有一个盘子,就是边界条件,无需再对第二条子句进行匹配了。
第二个move子句为递归调用,首先把盘子数目减少一个,再递归调用move,把N-1个盘子从A杆通过C杆移到B杆,再把A杆上的最后一个盘子直接从A杆移到C杆上,最后再递归调用move,把B杆上的N-1个盘子通过A杆移到C杆上。
c汉诺塔问题递归算法

c汉诺塔问题递归算法
汉诺塔问题是一个经典的递归问题,它可以通过递归算法来求解。
下面是汉诺塔问题的递归算法:
cCopycodevoidhanoi(intn,charA,charB,charC){//将n个盘子从A 经由B移动到
Cif(n==1){printf("Movedisk1from%cto%c\n",A,C);}else{hanoi(n -1,A,C,B);//将n-1个盘子从A经由C移动到
Bprintf("Movedisk%dfrom%cto%c\n",n,A,C);hanoi(n-1,B,A,C);//将n-1个盘子从B经由A移动到C}}上述算法中,hanoi函数接受四个参数,其中n表示盘子的数量,A、B、C分别表示三根柱子,其中A是起始柱子,B是中间柱子,C是目标柱子。
如果n=1,则直接将第一个盘子从A移动到C。
如果n1,则将n个盘子从A经由C移动到B,然后将第n个盘子从A移动到C,最后将n个盘子从B经由A移动到C。
这样递归调用,直到n=1的时候,递归结束。
c语言 递归函数实现 汉诺塔

c语言递归函数实现汉诺塔
汉诺塔是一种著名的数学问题,也是经典的递归算法题目。
它包含三个塔座和一些圆盘,盘子大小不一,大的在下面,小的在上面。
开始时,所有的盘子都放在第一个塔座上,要把它们从第一个塔座移动到第三个塔座上,移动时要遵循以下规则:
1.每次只能移动一个盘子;
2.大盘子不能放在小盘子上面。
递归算法是实现汉诺塔问题的最简单方法。
在递归函数中,把整个问题分解成子问题,直至问题规模为1时,直接解决。
下面是C语言实现汉诺塔问题的递归函数:
void hanoi(int n, char A, char B, char C) {
if (n == 1) {
printf('%c -> %c
', A, C);
return;
}
hanoi(n-1, A, C, B);
printf('%c -> %c
', A, C);
hanoi(n-1, B, A, C);
}
函数参数说明:
n:当前塔座上的盘子数量;
A, B, C:三个塔座的名称。
函数实现说明:
1.当塔座上只有一个盘子时,直接将其从A塔座移动到C塔座上;
2.当塔座上有n个盘子时,首先将A塔座上的n-1个盘子移动到B塔座上,然后将A塔座上的一个盘子移动到C塔座上,最后将B塔座上的n-1个盘子移动到C塔座上。
通过递归调用hanoi函数,就能够解决汉诺塔问题。
Hanoi塔的问题

Hanoi塔的问题/*Hanoi塔的问题题目描述:Hanoi塔的问题相信大家很熟悉了:有三根针上放了一些圆盘,半径各不相同,大的不能放在小的上面,每次只能移动一个,要把它们全部移到第三根针上输入:多组测试数据,每组两行。
第一行是n(1<=n<=32),表示有多少个盘接下来一行由n个数字1,2,3组成的数字串,第一个数表示最大的盘在第几根针上,第二个数表示次大的盘在第几根针上,第n个数表示最小的盘在第几根针上,输入的n为0的时候结束输出:全部移动到第三根针上所需要的最少步数样例输入:31113321*/#include <stdio.h>long i64Hanoi[33]; // 表示把i 个盘从一根柱子移动到另一根柱子所需的最少步数为i64Hanoi[i]int iDisk[33]; // 表示i 号盘在iDisk[i] 号柱上/****************************函数功能:计算把iCount 个盘移动到iAim 号柱的最少步数入口参数:盘子个数:int iCount目标柱号码:int iAim返回值:把iCount 个盘移动到iAim 号柱的最少步数*****************************/long Hanoi(int iCount, int iAim) // 计算把iCount 个盘移动到iAim 号柱的最少步数{if (iCount==0) // 递归边界:当0个盘子,最少步数也为0return 0;else if (iDisk[iCount-1]==iAim) // 当大盘在目标柱,只需移动余下(n-1)个盘到目标柱return Hanoi(iCount-1, iAim);else// 大盘不在目标柱的时候应该做下面3步:// 1)把除大盘以外的(n-1)个盘移动到另一根非目标柱:Hanoi(iCount-1, 6-iAim-iDisk[iCount-1]) (return 的第一部分)// 其中:6-iAim-iDisk[iCount-1] 恰为另一根非目标柱的号码。
数据结构C语言实现之hanoi塔问题

y
move(Sx, n, Sz);
//将编号为 n 的圆盘从 x 移到 z
Hanoi(n-1, Sy, Sx, Sz); //将 y 上编号为 1 至 n-1 的圆盘利用 x 移到z} Nhomakorabea}
void main() {
SNode *Sx, *Sy, *Sz; int i = 0, n = 0; char ck = 0;
//将 x 上的圆盘编号
i++;
}
Hanoi(n, &Sx, &Sy, &Sz);
printf("\n 从 X 移到 Z 的结果是:\n");
Print(&Sz);
}
m = Pop(S1); Push(S2, m); }
void Hanoi(int n, SNode **Sx, SNode **Sy, SNode **Sz)
{
if (n == 1)
move(Sx, 1 , Sz);
//将编号为 1 的圆盘由 x 移到 z
else
{
Hanoi(n-1, Sx, Sz, Sy); //将 x 上编号为 1 到 n-1 的圆盘利用 z 移到
int data; struct Stack *next; }SNode;
void InitStack(SNode **S) {
*S = (SNode *) malloc (sizeof(SNode)); (*S)->next = NULL; //先建立一个带头结点 }
void Push(SNode **S, int ck)
void Print(SNode **S) {
SNode *p; p = (*S)->next; while(p) {
汉诺塔(C语言)

bar(160, 540, 240, 580);
setfont(30, 0, "黑体");
++s[0].top;//进栈
for (int i1 = 0; i1 < 4; i1++)
{
p[i]->a[i1] = ta[i1];
s[0].stack[s[0].top] = p[i];//记录每个矩形的位置,top为圆盘的个数
}
}
Hannoi(n, 'a', 'b', 'c');//汉诺塔递归函数
//绘制运动画面的的环境
setcolor(RED);
//三根红色线段作为钢针
line(400, 110, 400, 500);
line(600, 110, 600, 500);
line(200, 110, 200, 500);
//长方体形的底座
setfillstyle(LIGHTGRAY);
bar3d(80, 500, 720, 510, 10, true);
#include <graphics.h>
#include <conio.h>
#include <stdio.h>
#define MAX 64//圆盘的最大数目
#define NULL 0
//定义栈
struct STKNODE
{
int a[4];
};
struct STK
{
STKNODE*stack[MAX];
inttop;
};
//定义全局变量
STK s[3];//声明三个栈,分别代表一号二号三号钢针上圆盘的状态
c语言递归汉诺塔每一步详解

递归汉诺塔是一个经典的递归问题,它要求将一堆圆盘从一根柱子移动到另一根柱子上,且规定不能通过其他圆盘。
这个问题可以通过递归算法来解决。
在每一步中,我们可以选择将当前最大的圆盘从起始柱子移动到目标柱子,或者将两个较小的圆盘移动到另一个柱子上。
递归函数需要考虑三个柱子的状态:起始柱子、目标柱子和柱子。
在函数中,我们需要判断当前情况是否可以进行移动,如果可以,则执行相应的移动操作,否则返回上一个递归函数继续执行。
最终,当所有圆盘都移到目标柱子上时,问题得到解决。
汉诺塔问题c语言实现

汉诺塔问题c语言实现
汉诺塔问题是一道经典的递归问题,它涉及到将若干个不同大小的圆盘,按照一定规则移动到另一个柱子上的问题。
这个问题可以用C语言进行实现。
首先,我们需要定义汉诺塔问题的三个柱子,并初始化三个柱子上的圆盘。
然后,我们可以编写一个递归函数,用来移动圆盘。
该函数的参数包括当前所在的柱子、目标柱子以及要移动的圆盘数量。
在函数内部,我们可以先将除要移动的圆盘外的其余圆盘,从当前柱子移动到中间柱子上。
然后,将要移动的圆盘从当前柱子移动到目标柱子上。
最后,将中间柱子上的其余圆盘,从中间柱子移动到目标柱子上。
递归的结束条件是只要有一个圆盘需要移动,就直接将其从当前柱子移动到目标柱子上即可。
- 1 -。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// algo3-10.cpp Hanoi塔问题,调用算法3.5的程序
#include<stdio.h>
int c=0; // 全局变量,搬动次数
void move(char x,int n,char z)
{ // 第n个圆盘从塔座x搬到塔座z
printf("第%i步: 将%i号盘从%c移到%c\n",++c,n,x,z);
}
void hanoi(int n,char x,char y,char z) // 算法3.5
{ // 将塔座x上按直径由小到大且自上而下编号为1至n的n个圆盘
// 按规则搬到塔座z上。
y可用作辅助塔座
if(n==1)
move(x,1,z); // 将编号为1的圆盘从x移到z
else
{
hanoi(n-1,x,z,y); // 将x上编号为1至n-1的圆盘移到y,z作辅助塔
move(x,n,z); // 将编号为n的圆盘从x移到z
hanoi(n-1,y,x,z); // 将y上编号为1至n-1的圆盘移到z,x作辅助塔
}
}
int main()
{
int n;
printf("3个塔座为a、b、c,圆盘最初在a座,借助b座移到c座。
请输入圆盘数:"); scanf("%d",&n);
hanoi(n,'a','b','c');
}。