使用the eight queens puzzle编写的按位运算分析Martin Richards的解决方案,尽管咨询the language manual,但我很难理解基本的MCPL函数语法。 以下是完整的计划:
GET "mcpl.h"
STATIC count, all
FUN try
: ?, =all, ? => count++
: ld, cols, rd => LET poss = ~(ld | cols | rd) & all
WHILE poss DO
{ LET bit = poss & -poss
poss -:= bit
try( (ld|bit)<<1, cols|bit, (rd|bit)>>1 )
}
FUN start : =>
all := 1
FOR n = 1 TO 12 DO
{ count := 0
try(0, 0, 0)
writef("There are %5d solutions to %2d-queens problem\n", count, n)
all := 2*all + 1
}
RETURN 0
我无法理解的是函数try
的前两行,即问号?
语法以及如何传递(和处理)参数。
手册读取
问号(?)可以用作具有未定义值的常量。
以及
模式用于函数定义。 [...] 问号(?)或空模式将匹配任何参数值。
此语法对参数的含义是什么?ld
,cols
和rd
如何给出它们的初始值?
答案 0 :(得分:0)
在找到进一步讨论上述和其他类似算法的论文之后,我开始发现
: ?, =all, ? => count++
基本上检查是否为cols == all
,如果是,则找到完整的解决方案(增加count
)。
ld
,cols
和rd
都有参数值
对我来说看起来很奇怪的是在使用参数之前执行检查,所以我可能仍然缺少一些细节。