- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验二 Hanoi塔问题
实验二 递归程序设计
一、实验目的
1、理解PROLOG编制递归程序的方法:边界条件与递归部分的设计;
2、熟悉运用递归分析、解决问题的方法。
二、实验内容及步骤
(一)Hanoi塔问题:
如上图,目的是把左边的所有盘子移到右边的杆子上。一次只能移动一个盘子,可以使用中间的杆子作为临时存放盘子的地方。小盘子必须放在大盘子之上。用递归来解决这个问题如果只有一个盘子,直接移过去就行了,这是递归的边界条件。如果要移动N个盘子,就要分三步走:把N-1个盘子移动到中间的杆子上(把右边的杆子作为临时存放盘子的位置)把最后一个盘子直接移到右边的杆子上。最后把中间杆子上的盘子移到右边的杆子上(把左边的杆子作为临时存放盘子的位置)。上面第一、三步用到了递归。我们看到,通过递归把N个盘子的问题变成了两个N-1个盘子的问题。如此下去,最后就变成了个一个盘子的问题了,这也就是说问题被解决了。Prolog代码:
hanoi(N):- move(N,left,middle,right).
move(1,A,_,C):- inform(A,C), !. {! 为cut操作,截断进一步搜索}
move(N,A,B,C):- N1 is 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杆上。这里的杆子都是使用变量来代表的,A、B、C杆可以是left、middle、right中的任何一个,这是在移动的过程中决定的。inform,把移动过程通过write谓词写出#includestdio.h
void hanoi(int n,char A,char B,char C)
{
if(n==1)
printf(Move disk %d from %c to %c\n,n,A,C);
else
{ hanoi(n-1,A,C,B);
printf(Move disk %d from %c to %c\n,n,A,C);
hanoi(n-1,B,A,C);
}
}
main()
{ int n;
printf(Enter n:\n);
scanf(%d,n);
hanoi(n,A,B,C);
getch();
}
(二)井字游戏。
在一个3×3的空棋盘(图(a))上,对弈对方(X和O)轮流落下棋子,先占据一条直线者(行、列、对角线均可)为胜者。站在O方立场上,找出当前棋盘上的危险点。如图(b),O方的危险点是正中间点,即“5”号位置。
分析:解决问题的思路是把实际问题进行抽象,寻找数学模型。如何描述棋盘呢?如图 (c)所示,可对棋盘进行编号,整个棋盘共有8条直线,每条直线上三个数字,如1、2、3,1、5、9等。在某个棋局下,对每条直线逐一地进行考查,看在其中是否有危险点,如有就马上指出而终止。
井字游戏Prolog代码:
DOMAINS
int=integer.
intlist=int*.
charlist=char*.
PREDICATES
aline(intlist)
forced_move(charlist,int)
threatening(intlist,charlist,int)
empty(int,charlist)
cross(int,charlist)
arg(int,charlist,char)
arg1(int,charlist,int,char)
go(int)
CLAUSES
aline([1,2,3]).
aline([4,5,6]).
aline([7,8,9]).
aline([1,4,5]).
aline([2,5,8]).
aline(
您可能关注的文档
最近下载
- 政论型电视专题政论片.ppt VIP
- 新版GCP临床试验伦理规范培训考试题一套 .pdf VIP
- 新编高等数学(理工类)第一章 极限与连续.ppt VIP
- 13J104 蒸压加气混凝土砌块、板材构造(OCR).pdf VIP
- 2024版思想道德与法治专题1担当复兴大任成就时代新人.pptx VIP
- 章绍同《鼓浪屿狂想曲》.pdf VIP
- UG机械设计实例教程 第2章 曲柄滑块机构建模与运动仿真.ppt VIP
- 2025年最新人教版小学二年级数学上册教学计划及进度表(新课标,新教材).docx
- 2024-2025学年小学道德与法治统编版(2024)三年级上册教学设计合集.docx
- 河道整治及生态修复工程监理细则(88页)_最新版.pdf VIP
文档评论(0)