实验二 Hanoi塔问题.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 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(

文档评论(0)

asd522513656 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档