人工智能实验产生式系统解决汉诺塔(有代码)
汉诺塔问题c语言实现

汉诺塔问题c语言实现汉诺塔问题是一种经典的递归问题,也是计算机算法中的重要问题之一。
本文将介绍如何使用C语言实现汉诺塔问题。
汉诺塔问题的规则是:有三根柱子A、B、C,其中A柱子上有n 个盘子,这些盘子大小不等,大的在下面,小的在上面。
现在要把这n个盘子从A柱子移动到C柱子上,但是每次只能移动一个盘子,并且在移动过程中,任何时候都不能让大盘子放在小盘子上面。
最终要求把所有盘子都移动到C柱子上。
下面是汉诺塔问题的C语言实现代码:#include <stdio.h>void hanoi(int n, char A, char B, char C) {if (n == 1) {printf('%c -> %c', A, C);} else {hanoi(n-1, A, C, B);printf('%c -> %c', A, C);hanoi(n-1, B, A, C);}}int main() {int n;printf('请输入盘子的个数:');scanf('%d', &n);printf('移动的步骤如下:');hanoi(n, 'A', 'B', 'C');return 0;}在上面的代码中,hanoi函数是一个递归函数,用来实现汉诺塔问题的移动过程。
当n等于1时,直接将A柱子上的盘子移动到C柱子上;当n大于1时,将A柱子上的n-1个盘子移动到B柱子上,再将A柱子上的最后一个盘子移动到C柱子上,最后将B柱子上的n-1个盘子移动到C柱子上。
在main函数中,先输入要移动的盘子个数n,然后调用hanoi 函数进行移动,最后输出移动的步骤。
通过上面的代码,我们可以很方便地实现汉诺塔问题的求解。
汉诺塔程序

实现输出汉诺塔问题盘子个数为4时的移动步骤程序代码:void move(char X,int n,char Z){cout<<"将编号为"<<n<<"的盘子"<<"从"<<X<<"移到"<<Z<<endl;}void hanoi(int n,char X,char Y,char Z){if(n==1)move(X,1,Z);else{hanoi(n-1,X,Z,Y);move(X,n,Z);hanoi(n-1,Y,X,Z);}}int main(){int m;cout<<"请输入盘子的个数:";cin>>m;cout<<m<<"个盘子的移动步骤为: "<<endl;hanoi(m,'A','B','C');return 0;}数据测试:输入盘子个数为4时,盘子的移动步骤如下分析过程:要将4个盘子从A移到C,首先须借助C将A上的三个盘子移到B,将A上最大的盘子从A移到C后,接着将三个盘子借助A从B移到C;而将三个盘子从A移到B,则应借助C将上面的两个盘从A移到C,然后将A上最下面的盘移到B,再将C上的盘借助A移到B。
以此类推。
用算法实现时声明函数hanoi()和move(),hanoi函数是在需要借助辅助盘时才调用,同时调用该函数时会递归调用move函数;而每次调用move函数时,则输出每一次的移动步骤。
问题:写算法前思路虽然清晰,但写程序要使用到递归调用时还是没能运用自如。
另外,不懂得将本章学习的栈的内容运用到程序上。
《人工智能》课后答案

《人工智能》课后答案第一章课后习题1、对N=5、k≤3时,求解传教士和野人问题的产生式系统各组成部分进行描述(给出综合数据库、规则集合的形式化描述,给出初始状态和目标条件的描述),并画出状态空间图。
2、对量水问题给出产生式系统描述,并画出状态空间图。
有两个无刻度标志的水壶,分别可装5升和2升的水。
设另有一水缸,可用来向水壶灌水或倒出水,两个水壶之间,水也可以相互倾灌。
已知5升壶为满壶,2升壶为空壶,问如何通过倒水或灌水操作,使能在2升的壶中量出一升的水来。
3、对梵塔问题给出产生式系统描述,并讨论N为任意时状态空间的规模。
相传古代某处一庙宇中,有三根立柱,柱子上可套放直径不等的N个圆盘,开始时所有圆盘都放在第一根柱子上,且小盘处在大盘之上,即从下向上直径是递减的。
和尚们的任务是把所有圆盘一次一个地搬到另一个柱子上去(不许暂搁地上等),且小盘只许在大盘之上。
问和尚们如何搬法最后能完成将所有的盘子都移到第三根柱子上(其余两根柱子,有一根可作过渡盘子使用)。
求N=2时,求解该问题的产生式系统描述,给出其状态空间图。
讨论N为任意时,状态空间的规模。
4、对猴子摘香蕉问题,给出产生式系统描述。
一个房间里,天花板上挂有一串香蕉,有一只猴子可在房间里任意活动(到处走动,推移箱子,攀登箱子等)。
设房间里还有一只可被猴子移动的箱子,且猴子登上箱子时才能摘到香蕉,问猴子在某一状态下(设猴子位置为a,箱子位置为b,香蕉位置为c),如何行动可摘取到香蕉。
5、对三枚钱币问题给出产生式系统描述及状态空间图。
设有三枚钱币,其排列处在"正、正、反"状态,现允许每次可翻动其中任意一个钱币,问只许操作三次的情况下,如何翻动钱币使其变成"正、正、正"或"反、反、反"状态。
6、说明怎样才能用一个产生式系统把十进制数转换为二进制数,并通过转换141.125这个数为二进制数,阐明其运行过程。
【C语言程序设计】汉诺塔问题,用C语言实现汉诺塔!

【C语⾔程序设计】汉诺塔问题,⽤C语⾔实现汉诺塔!汉诺塔问题是指:⼀块板上有三根针 A、B、C。
A 针上套有 64 个⼤⼩不等的圆盘,按照⼤的在下、⼩的在上的顺序排列,要把这 64 个圆盘从 A 针移动到 C 针上,每次只能移动⼀个圆盘,移动过程可以借助 B 针。
但在任何时候,任何针上的圆盘都必须保持⼤盘在下,⼩盘在上。
从键盘输⼊需移动的圆盘个数,给出移动的过程。
算法思想对于汉诺塔问题,当只移动⼀个圆盘时,直接将圆盘从 A 针移动到 C 针。
若移动的圆盘为 n(n>1),则分成⼏步⾛:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后⼀个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。
每做⼀遍,移动的圆盘少⼀个,逐次递减,最后当 n 为 1 时,完成整个移动过程。
因此,解决汉诺塔问题可设计⼀个递归函数,利⽤递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。
程序代码#include <stdio.h>int main(){int hanoi(int,char,char,char);int n,counter;printf("Input the number of diskes:");scanf("%d",&n);printf("\n");counter=hanoi(n,'A','B','C');return0;}int hanoi(int n,char x,char y,char z){int move(char,int,char);if(n==1)move(x,1,z);else{hanoi(n-1,x,z,y);move(x,n,z);hanoi(n-1,y,x,z);}return0;}int move(char getone,int n,char putone){static int k=1;printf("%2d:%3d # %c---%c\n",k,n,getone,putone);if(k++%3==0)printf("\n");return0;}调试运⾏结果:当移动圆盘个数为 3 时,具体移动步骤如下所⽰:Input the number of diskes:31: 1 # A---C2: 2 # A---B3: 1 # C---B4: 3 # A---C5: 1 # B---A6: 2 # B---C7: 1 # A---C总结:本实例中定义的 hanoi() 函数是⼀个递归函数,它有四个形参"n""x""y""z"。
scratch汉诺塔递归算法

Scratch汉诺塔递归算法1. 引言汉诺塔(Hanoi Tower)是一种经典的数学问题,它可以帮助我们理解递归算法的原理和应用。
在这个任务中,我们将使用Scratch编程语言来实现汉诺塔递归算法。
2. 汉诺塔问题简介汉诺塔问题源于印度传说中的一个故事。
据说,在一个庙里有三根针,第一根针上套着64个不同大小的金盘子,大的在下面,小的在上面。
庙里的和尚每天都要将这些金盘子从第一根针移动到第三根针上,但是移动时必须遵守以下规则:1.每次只能移动一个盘子;2.每次移动必须将较小的盘子放在较大的盘子上面;3.可以借助第二根针作为中转。
3. 算法设计思路要解决汉诺塔问题,我们可以使用递归算法。
递归是一种函数调用自身的方法。
对于汉诺塔问题来说,我们可以将其分解为三个步骤:1.将n-1个盘子从第一根针移动到第二根针(借助第三根针作为中转);2.将第n个盘子从第一根针移动到第三根针;3.将n-1个盘子从第二根针移动到第三根针(借助第一根针作为中转)。
这样,我们可以通过递归调用这三个步骤来解决汉诺塔问题。
4. Scratch实现在Scratch中实现汉诺塔递归算法,我们需要创建以下角色和代码块:4.1 角色设计我们需要创建三个角色来表示三根针,以及一个角色来表示金盘子。
每个角色都应该有一个变量来表示当前所在的位置。
4.2 代码块设计我们需要设计以下代码块来实现汉诺塔递归算法:4.2.1 初始化代码块在初始化时,我们需要将金盘子放置在第一根针上,并设置好每个金盘子的大小。
当绿旗被点击时把金盘子放置在第一根针上设置金盘子大小4.2.2 移动代码块移动一个金盘子的过程可以分为以下几步:1.判断当前金盘子是否在目标针上;2.如果在目标针上,结束移动;3.如果不在目标针上,找到下一个需要移动到的位置(借助另外一根针);4.将当前金盘子移动到下一个位置;5.递归调用移动代码块,将剩余的金盘子移动到目标针上。
当收到 [移动金盘子 v] 消息时如果 [当前位置 v] = [目标位置 v] ?那么结束此脚本否则设置 [下一个位置 v] 为 (3 - [当前位置 v] - [目标位置 v])把金盘子放置在第 [下一个位置 v] 根针上把金盘子移到第 [目标位置 v] 根针上发送消息 (移动金盘子) 给自己并等待 (0.5) 秒4.2.3 触发移动代码块为了触发整个移动过程,我们可以创建一个按钮,并在其点击事件中调用移动代码块。
python实现汉诺塔游戏

python实现汉诺塔游戏汉诺塔(Hanoi Tower)是一种经典的益智游戏,起源于中国。
它的规则很简单,但是解决它的问题却需要一定的智力和耐心。
下面我将用Python实现一个汉诺塔游戏。
汉诺塔游戏的规则如下:-有三根柱子,分别为A、B、C。
开始时,所有的盘子都堆在柱子A 上,从大到小依次摆放。
-目标是把所有的盘子从柱子A移动到柱子C上。
-移动盘子时,每次只能移动一个盘子,且必须保证大盘子在小盘子下面。
我们可以使用递归算法来解决这个问题。
具体实现如下:```pythondef hanoi(n, source, target, auxiliary):if n > 0:# 先将n-1个盘子从source柱子移动到auxiliary柱子上hanoi(n-1, source, auxiliary, target)# 将第n个盘子从source柱子移动到target柱子上print("Move disk", n, "from", source, "to", target)# 将n-1个盘子从auxiliary柱子移动到target柱子上hanoi(n-1, auxiliary, target, source)#测试hanoi(3, 'A', 'C', 'B')```上述代码中的`hanoi`函数用来实现递归的移动盘子操作。
参数`n`表示当前要移动的盘子数量,`source`表示源柱子,`target`表示目标柱子,`auxiliary`表示辅助柱子。
在代码中,我们首先判断`n`是否大于0,如果是,则进行递归操作。
首先将`n-1`个盘子从源柱子移动到辅助柱子上,然后将第`n`个盘子从源柱子移动到目标柱子上,最后将`n-1`个盘子从辅助柱子移动到目标柱子上。
我们可以通过调用`hanoi`函数来测试代码。
汉诺塔问题的程序实现

汉诺塔问题的程序实现汉诺塔问题的程序实现实验⽬的:运⽤程序解决汉诺塔(hanoi)问题。
汉诺塔问题:假设有3个分别命名为A,B,C的塔座,在塔座A上插有n个直径⼤⼩各不相同,依⼩到⼤编号为1,2....,n的圆盘。
现要求将A轴上的n个圆盘移到C并仍按同样顺序叠排,圆盘按以下规则(1)每次只能⼀动⼀个盘⼦(2)圆盘可以插在A,B,C中任⼀个塔座上(3)任何时刻都不能将⼀个较⼤的圆盘压在较⼩的圆盘之上。
A B C实验分析:汉诺塔问题可以规划为⼀个递归的问题予以分析,将n个盘⼦从A针移动到C 针可进⾏3个步骤:(1)将A上n-1的个盘⼦移到B针上;(2)把A针最后1个盘⼦移到C针上;(3)再把B盘⼦上的n-1个移到C针上。
实验过程:#includeusing namespace std;void main(){void hanoi(int m,char A,char B,char C); //A代表初始柱⼦,B代表辅助柱⼦,C代表⽬标柱⼦int m;printf("请输⼊盘⼦的个数:");scanf("%d", &m);printf("当盘⼦的个数为%d时移动的步骤是:\n",m);hanoi(m,'A','B','C');}void hanoi(int n,char X,char Y,char Z){void move(char X,char Z );if(n==1)move(X,Z);else{hanoi(n-1,X,Z,Y);move(X,Z);hanoi(n-1,Y,X,Z);}}void move(char x,char y){printf("%c-->%c\n",x,y);}过程:A代表初始柱⼦,B代表辅助柱⼦,C代表⽬标柱⼦。
⽽a代表第⼀根柱⼦,b代表第⼆根柱⼦,c代表第三根柱⼦。
汉诺塔综合实践报告

一、引言汉诺塔问题是一种经典的递归问题,起源于印度的一个古老传说。
该问题涉及三个柱子和若干个大小不一的盘子,要求按照一定的规则将盘子从第一个柱子移动到第三个柱子。
在解决汉诺塔问题的过程中,我们可以锻炼逻辑思维、递归算法设计以及编程能力。
本报告将详细介绍汉诺塔问题的背景、解决方法、实践过程及心得体会。
二、汉诺塔问题背景汉诺塔问题最早由法国数学家卢卡斯在1883年提出。
传说在古印度有一个名为汉诺塔的庙宇,庙里有一个汉诺塔塔,塔上有64个盘子,每个盘子大小不同,且按照从小到大的顺序叠放。
为了拯救世界,僧侣们需要将所有盘子从第一个柱子移动到第三个柱子,同时每次只能移动一个盘子,且在移动过程中,大盘子不能放在小盘子上面。
三、汉诺塔问题解决方法1. 递归算法汉诺塔问题可以通过递归算法来解决。
递归算法的基本思想是将大问题分解为若干个小问题,然后逐一解决小问题,最终解决大问题。
对于汉诺塔问题,我们可以将其分解为以下三个步骤:(1)将n-1个盘子从第一个柱子移动到第二个柱子;(2)将第n个盘子从第一个柱子移动到第三个柱子;(3)将n-1个盘子从第二个柱子移动到第三个柱子。
递归算法如下:```function hanoi(n, start, end, auxiliary) {if (n == 1) {console.log(`移动盘子1从${start}到${end}`);return;}hanoi(n - 1, start, auxiliary, end);console.log(`移动盘子${n}从${start}到${end}`);hanoi(n - 1, auxiliary, end, start);}```2. 动态规划除了递归算法,我们还可以使用动态规划的方法来解决汉诺塔问题。
动态规划的思想是将问题分解为若干个子问题,然后求解子问题,最后将子问题的解合并成原问题的解。
对于汉诺塔问题,我们可以定义一个二维数组dp[i][j],表示将i个盘子从第一个柱子移动到第j个柱子的最小移动次数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一一、实验目的:掌握产生式系统解决汉诺塔算法的基本思想。
二、问题描述:如图所示放置3根柱子,其中一根从上往下按由小到大顺序串有若干个圆盘,要求通过3根柱子移动圆盘。
若规定每次只能移动1片,且不许大盘放在小盘之上,最后要将圆盘从一根柱子移动到另一根柱子上。
三、问题分析及基本思想:汉诺塔(也被称为梵塔)问题有很多解决方法,比较典型的是使用递归算法,而本次设计的算法则是应用人工智能中产生式相关知识进行的求解。
数学模型描述如下:1、设计该问题的状态。
使用了二维数组描述汉诺塔的状态,对n个盘子由大到小分别用数组n、n-1...2、1描述。
例如:当n=4时,二维数组为:1002003004002、定义目标状态。
当n=4时,这里是:001002003004依据如下规则定义产生式规则:1、在移动盘子时,每次只移动A\B\C柱子上可以移动的盘子中最大的盘子。
2、如果上一次已经移动了某个盘子,则下一次不能继续移动,即:一个盘子不能被连续移动两次。
如:某次操作将1号盘子由A柱子移动到B柱子,那么在选择下一个要移动的盘子时应不在考虑1号盘。
3、当某个可以移动的盘子摆放位置不唯一时要将当前状态入栈,并选择盘子移动前所在的柱子的左侧(同理:反方向选择也可)柱子作为移动的目标柱子。
为提高程序运行过程中的空间利用率,产生式规则在汉诺塔移动过程中依据以上规则自动生成。
控制策略依据如下:1、根据以上产生式规则依据,在每次移动盘子时可选择产生式唯一,所以不需要考虑路径选择。
2、当移动的是一组盘子中的最大盘子(即:在要移动的一组盘子中的最下面的盘子)时,观察目标柱子是否是C柱子(最终结果所在柱子),如果是则表示当前盘子移动成功,并清空栈,转移问题(即减小一层盘子);如果移动目标错误(即移动到了A或B柱子)则执行回溯:栈顶状态出栈,向右选择目标柱子产生新的产生式规则,并按此执行移动操作。
3、如果要移动的一组盘子中最大的是1号盘(最后一个盘子),执行的移动操作是将盘子移动到C柱子,则算法结束。
四、主要功能流程图如下:(注意:本设计控制盘子为九个)。
五、源程序:package Hanoi;import java.util.Arrays;import java.util.Scanner;import java.util.Stack;public class Hanoi {public static void main(String[] args) {Scanner in = new Scanner(System.in);System.out.println("请输入汉诺塔盘子的个数:");int n = in.nextInt();// 定义初始状态int[][] first = new int[n][3];System.out.println("初始状态:");for (int i = 0; i < n; i++) {first[i][0] = i + 1;System.out.println(Arrays.toString(first[i]));}// 定义目标状态int[][] end = new int[n][3];for (int i = 0; i < n; i++) {end[i][2] = i + 1;// System.out.println(Arrays.toString(end[i]));}int maxValue = n;// 定义可以移动的最大盘子的值,初值Disk before = null;// 定义上一个移动的盘子,初始值为nullStack<int[][]> stack = new Stack<int[][]>();// 定义存放盘子状态的栈Stack<Disk> bs = new Stack<Disk>();b: while (true) {System.out.println("before:" + before);Disk canMoveDisk = Hanoi.findMoveDisk(first, before);// 找出当前可移动盘子// System.out.println("canMoveDisk:" + canMoveDisk);Disk[] movePlace = Hanoi.movePlace(first,Hanoi.findMoveDisk(first, before));// 返回当前可移动去的位置数组// System.out.println("locateionNumber:" +movePlace.length);Disk right = movePlace[0];// 如果可移动位置有两个,right 为右侧位置Disk left = movePlace[0];// 如果可移动位置有两个,left为左侧位置if (movePlace.length == 2) {if(movePlace[0].y==(canMoveDisk.y+1)%3){right=movePlace[0];left=movePlace[1];}else if(movePlace[0].y==(canMoveDisk.y+2)%3){right=movePlace[1];left=movePlace[0];}int[][] a = new int[n][3];for (int i = 0; i < n; i++)for (int j = 0; j < 3; j++)a[i][j] = first[i][j];stack.push(a);// 把当前状态入栈if (before == null)bs.push(null);else {Disk x = new Disk(before.x, before.y);bs.push(x);}System.out.println("入栈");}// System.out.println("right:" + right);Hanoi.move(canMoveDisk, right, first);before = right;if (maxValue == 1 && Hanoi.findDiskPrice(right, first) == 1&& right.y == 2)break b;if (Hanoi.findDiskPrice(right, first) == maxValue) {// 如果移动了要移动的最大盘子// 如果是则判断目标柱子是否是最终结果所在柱子if (right.y == 2) {// 如果是// 清空栈while(!stack.isEmpty()){stack.pop();}while(!bs.isEmpty()){bs.pop();}System.out.println("清空栈");maxValue =maxValue-1;// 要移动的最大盘子减1} else {for (int i = 0; i < n; i++)for (int j = 0; j < 3; j++)first[i][j] = stack.peek()[i][j];stack.pop();// 出栈恢复System.out.println("出栈恢复");Hanoi.print(first);Disk x = null;if (bs.peek() != null)x = new Disk(bs.peek().x, bs.peek().y);Disk canMoveDisk2 = Hanoi.findMoveDisk(first, x);bs.pop();Disk[] movePlace2 = Hanoi.movePlace(first, canMoveDisk2);// System.out.println("canMoveDisk:" + canMoveDisk2);// System.out.println("locateionNumber:" + movePlace2.length);Disk r = movePlace2[0];// 如果可移动位置有两个,right为右侧位置Disk l = movePlace2[0];// 如果可移动位置有两个,left为左侧位置if (movePlace2.length == 2) {if(movePlace2[0].y==(canMoveDisk2.y+1)%3){r=movePlace2[0];l=movePlace2[1];}elseif(movePlace2[0].y==(canMoveDisk2.y+2)%3){r=movePlace2[1];l=movePlace2[0];}}Hanoi.move(canMoveDisk2, l, first);// 选择左侧位置移动盘子// System.out.println("canMoveDisk:" + canMoveDisk2);// System.out.println("locateionNumber:" + movePlace.length);// System.out.println("left:" + l);before = l;if (maxValue == 1 && Hanoi.findDiskPrice(left, first) == 1&& l.y == 2)break b;}}}}// 找出可移动的盘子private static Disk findMoveDisk(int[][] a, Disk before) { Disk[] d = new Disk[3];// 柱子1,2,3的顶部盘子for (int i = 0; i < 3; i++) {d[i] = Hanoi.findTopDisk(i + 1, a);}for (int i = 0; i < 3; i++) {if (before == null)return d[0];else if ((!before.equals(d[i]))&& Hanoi.findDiskPrice(d[i], a) != 0&& ((Hanoi.findDiskPrice(d[i], a) <Hanoi.findDiskPrice(d[(i + 1) % 3], a)|| Hanoi.findDiskPrice(d[i], a) < Hanoi.findDiskPrice(d[(i + 2) % 3], a)|| Hanoi.findDiskPrice(d[(i + 1) % 3], a) == 0 || Hanoi.findDiskPrice(d[(i + 2) % 3], a) == 0))) // System.out.println(d[i]);return d[i];}return null;}// 找出可以移动的位置坐标private static Disk[] movePlace(int[][] a, Disk canMoveDisk) {Disk[] d = new Disk[2];int h = 0;// h是数组Disk的下标int i = canMoveDisk.y;// 当前可移动盘子的柱子纵坐标Disk d1 = findTopDisk((i + 1) % 3 + 1, a);Disk d2 = findTopDisk((i + 2) % 3 + 1, a);if (Hanoi.findDiskPrice(d1, a) == 0) {d[h] = d1;h++;} else if ((Hanoi.findDiskPrice(canMoveDisk, a) <Hanoi.findDiskPrice(d1, a))) {if (d1.x != 0) {Disk d0 = new Disk(d1.x - 1, d1.y);d[h] = d0;h++;}}if (Hanoi.findDiskPrice(d2, a) == 0) {d[h] = d2;h++;} else if ((Hanoi.findDiskPrice(canMoveDisk, a) < Hanoi.findDiskPrice(d2, a))) {if (d2.x != 0) {Disk d0 = new Disk(d2.x - 1, d2.y);d[h] = d0;h++;}}Disk[] d3;if(d[1]!=null){d3 = new Disk[2];d3[0] = d[0];d3[1] = d[1];}else{d3 = new Disk[1];d3[0] = d[0];}return d3;}// 找出一个Disk对应坐标的盘子值private static int findDiskPrice(Disk d, int[][] a) { return a[d.x][d.y];}// 找出柱子i的顶部盘子private static Disk findTopDisk(int i, int[][] a) { int j;for (j = 0; j < a.length; j++) {if (a[j][i - 1] == 0)continue;else {Disk d = new Disk(j, i - 1);return d;}}if (j >= a.length) {Disk d = new Disk(a.length - 1, i - 1);return d;}return null;}// 移动盘子,将盘子d1移至d2位置private static void move(Disk d1, Disk d2, int[][] a) { System.out.println("将盘子" + Hanoi.findDiskPrice(d1, a) + "从位置" + d1+ "移至位置" + d2 + " " + (d1.y + 1) + "号柱子-->" + (d2.y + 1)+ "号柱子");a[d2.x][d2.y] = a[d1.x][d1.y];a[d1.x][d1.y] = 0;Hanoi.print(a);}// 打印当前盘子位置分布private static void print(int[][] a) {for (int i = 0; i < a.length; i++)System.out.println(Arrays.toString(a[i]));}}package Hanoi;//定义一个盘子的位置class Disk {int x;// 盘子的横坐标int y;// 盘子的纵坐标public Disk(int x, int y) {this.x = x;this.y = y;}public boolean equals(Disk d) {if (this.x == d.x && this.y == d.y)return true;return false;}@Overridepublic String toString() {return"Disk" + "(" + this.x + "," + this.y + ")";}}六、运行结果(9层汉诺塔结果):......一层汉诺塔:二层汉诺塔:三层汉诺塔:七、结果分析:汉诺塔问题通过我们都知道的递归算法来实现很简单,而本实验中采用了产生式系统解决汉诺塔问题,确定要移动的盘子,确定盘子移去的位置都只要根据所给出的规则就能够确定了,整个实现过程看起来很复杂,其实根据给出的产生式规则都可以很好的解决。