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



在这个程序中,我将确定放置皇后是否会对棋盘造成威胁。这将使用位置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
        )
    )
)

这将是我的输入:

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

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

之前澄清我对这一点的理解问题。

我的错误如下:

*** - EVAL: 2不是函数名;试着用符号代替

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


修复这个错误后,我发现我的程序总是返回true。当输入'(1 3)'((10)…)它将返回真,尽管事实上(10)的0应该发现它等于0,返回真,然后否定真从而返回假,然而我的程序总是返回真。

编辑:修复之前的错误信息

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

注意元素从0开始编号,而不是1。

因此,(nth 1 '((1 0) (2 4) (3 7) ...))返回(2 4)(这里我们再次:-)而不是(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)))

最新更新