Mathematica程序汉诺塔游戏的解法演示汉诺塔游戏是一个很久远的故事了,相传只要将64个大小不等的圆环从第一个的竖立的杆上取下来,套在另一个竖立的杆上游戏就完成了,当然还有一个竖立的杆作为中介用来暂存一些圆环。规则很简单:每次取下1个圆环,始终保持小的圆环在大的圆环上方,取下来的圆环接着必须套在3个杆中的一个杆上面。我以前用Flash做了一个可以演示也可以实际操作的游戏。最近有了用Mathematica程序重新做的想法,昨天完成了演示部分。但是实际操作就有些棘手了,或许以后会做的,现在不会了。尽管曾经学习过C语言中递归语句的写法,但是还是不喜欢程序中用到它,因为有人提出的“让1转圈圈,其它的比大小”好像更能体现出该游戏的解答过程。在我做的两个不同版本的Flash动画中体现的很明显,如果先用递归语句写出所有步骤然后再移动圆环,那么停顿只在递归出结果的那一瞬间,但是如果我让圆环数为64时,根本无法出结果,总是显示程序太大,无法完成。但是如果用“让1转圈圈,其它的比大小”的办法来做,无论是圆环数是多少都不影响运行速度的。在我下面的Mathematica程序中无法体现出它的优越性,但是如果改成用Print来输出每步的图片的话,差别还是很明显的。所有程序如下:(*一.输入变量区域*)(*输入圆环总数:如果总数在11以内还是可以很快出结果的*)zongshu=11;(*从位置1移动到位置2则输入1->2,从位置1移动到位置3则输入1->3*)weizhi="1->3";(*二.计算结果区域*)(*下面这三行是赋初值*)a=Table[ii,{ii,zongshu,1,-1}];arr1={a,{},{}};arr2={arr1};(*下面这两个二级嵌套的If语句用来判断最小圆环的移动方向*)If[weizhi=="1->3"||weizhi=="1→3",mowei=3;If[Mod[zongshu,2]==0,fangx=1,fangx=-1];];If[weizhi=="1->2"||weizhi=="1→2",mowei=2;If[Mod[zongshu,2]==1,fangx=1,fangx=-1];];For[ii=1;jj=1,ii<2^(zongshu-1)+1,ii++,kk=arr1[[jj]][[-1]];arr1[[jj]]=Delete[arr1[[jj]],-1];jj=Mod[jj+fangx+2,3]+1;arr1[[jj]]=Append[arr1[[jj]],kk];arr2=Append[arr2,arr1];(*下面这两个If语句用来判断移动是否已经完成*)If[mowei==2&&arr1[[1]]=={}&&arr1[[3]]=={},Break[];];If[mowei==3&&arr1[[1]]=={}&&arr1[[2]]=={},Break[];];(*下面这一个三级嵌套的If语句判断除了最小圆环以外的圆环的移动方向*)If[arr1[[Mod[jj+1,3]+1]]=={},xuanze=1,If[arr1[[Mod[jj,3]+1]]=={},xuanze=2,If[arr1[[Mod[jj,3]+1]][[-1]]