Algorithm 框架–;Stewart算法在prolog中的实现
我正试图用四个钉子来编写河内塔问题的求解器Algorithm 框架–;Stewart算法在prolog中的实现,algorithm,prolog,towers-of-hanoi,Algorithm,Prolog,Towers Of Hanoi,我正试图用四个钉子来编写河内塔问题的求解器 %hanoi4(NrOfDisks, From, To, Seged1, Seged2, ListOfSteps) hanoi4(1,From, To, _,_,[From -> To]). hanoi4(Disks,From, To, Seged1, Seged2, ListOfSteps):- Pozitiv is 2*Disks+1, Pozitiv > 0, K is Dis
%hanoi4(NrOfDisks, From, To, Seged1, Seged2, ListOfSteps)
hanoi4(1,From, To, _,_,[From -> To]).
hanoi4(Disks,From, To, Seged1, Seged2, ListOfSteps):-
Pozitiv is 2*Disks+1,
Pozitiv > 0,
K is Disks-round(floor(sqrt(Pozitiv))+1),
hanoi4(K,From,Seged1,Seged2,To,Steps1),
hanoi4(Disks-K,From,To,Seged2,Seged1,Steps2),
append(Steps1,Steps2,Steps),
hanoi4(K,Seged1,To,From,Seged2,Steps3),
append(Steps,Steps3,ListOfSteps).
我将2*Disks+1表达式的值放入“Pozitiv”变量中,因为直接在sqrt谓词中写入时出错。(sqrt/1:算术:计算错误:`未定义')
我尝试按照的步骤进行操作。请注意,在Prolog中,除非显式调用使用
is/2
、CLP(FD)操作和一些数值表达式比较器,否则术语不会作为表达式进行计算。因此hanoi4(Disks-K,From,To,Seged2,Seged1,Steps2)
不执行Disks-K的子操作。您需要类似于Disks1是Disks-K
,后面是hanoi4(Disks1,From,To,Seged2,Seged1,Steps2)
。我不知道你为什么需要round(floor(…)
,因为floor/1
将产生一个整数,round
在这一点上没有任何作用。我非常感谢你的评论!我纠正了谓词调用,并去掉了ceil+round组合。在那之后,我发现我没有遵循算法的说明。它需要另一个函数来处理底部(n-k)磁盘的情况,因此当我们处理它们时,不会干扰前k个磁盘。现在一切都很好。