n-Queens - 逻辑错误 - 确定垂直威胁

时间:2016-10-04 21:06:14

标签: list lisp

在这个程序中,我将确定放置一个女王是否会对董事会造成威胁。这将使用位置1-8(可以扩展)作为行和列。如果一列中没有任何一块,则该行的y将为0(否则为相应的y)。空板如下:((1 0)(2 0)(3 0)(4 0)(5 0)(6 0)(7 0)(8 0))

我编写了以下程序来确定给定的移动是否会导致垂直威胁:

(defun THREAT? (x y)
    (not (eq
        (cdr (nth (car x) y ))
         0
        )
    )
)

这将是我的意见:

(THREAT?'(1 3)'(1 0)(2 4)(3 7)(4 3)(5 2)(6 8)(7 5)(8 1))

我的想法是,我抓住第一个参数(我正在检查的x值)的汽车使用它来访问第二个列表中的正确元素,并找到该元素的cdr,它将给我y值。然后我检查它是否为0,如果它不是0,那么它将是一个威胁。 我还没有添加检查水平和对角线的功能,所以我怀疑我可以通过条件或if语句轻松实现这一点,但我希望在继续之前清除我对此的理解中的问题

我的错误如下:

*** - EVAL:2不是函数名称;尝试使用符号

非常感谢任何和所有帮助!

修复该错误后,我发现我的程序将始终返回true。当输入'(1 3)'((1 0)...)时它将返回true,尽管(1 0)的0应该发现它等于0,返回true然后否定真如此返回是的,但我的程序总是会返回true。

编辑:修复了之前的错误消息

2 个答案:

答案 0 :(得分:2)

要了解(threat? '(1 3) '((1 0) (2 4) (3 7) (4 3) (5 2) (6 8) (7 5) (8 1)))返回true的原因,您必须查看nth的定义

  

请注意,元素从零开始编号,而不是一个。

所以,(nth 1 '((1 0) (2 4) (3 7) ...))会返回(2 4)(这里我们再次:-)而不是(1 0)

答案 1 :(得分:0)

错误消息来自第三个参数(2 4),这是正确的,因为2不是函数名。

Lisp在将所有参数传递给函数之前对其进行求值。在(2 4)的情况下,它搜索名为2的函数并失败。剩余的不带引号的参数也会发生同样的情况。

你的threat?函数只需要两个参数,所以我想,这应该是

(threat? '(1 3) '((1 0) (2 4) (3 7) (4 3) (5 2) (6 8) (7 5) (8 1)))