我正在尝试编写一个名为:get-element (board coords) 的函数,它将一 block 板和一对表示板位置的坐标作为输入。该对的第一个元素表示列号,第二个元素表示行号(索引从 0 开始)。该函数返回该棋盘位置的内容,可以是 X、O 或 NIL。使用以下测试板状态。
(defparameter *test-board*
'((nil nil nil nil nil nil)
(O nil nil nil nil nil)
(X nil nil nil nil nil)
(X X O nil nil nil)
(O O X nil nil nil)
(nil nil nil nil nil nil)
(nil nil nil nil nil nil)))
函数应该像这样工作:
(get-element *test-board* ‘(0 0))
> NIL
我似乎无法理解获得输出等过程。到目前为止,我的代码如下(但这是严重错误的!):
(col(nth 0 coords))
(row(nth 1 coords)))
如果您能帮助我们理解如何检索列表中的特定元素,我们将不胜感激!
最佳答案
我不会给你确切的解决方案,而是一个我希望对你自己产生它有用的推理。
您的数据结构由一个列表组成,列表中的每个元素代表棋盘的一行。因此,您有一个列表,其中的元素数量等于棋盘的行数。
这种列表的元素本身就是列表:所以每一行都由一个列表表示,其中每个元素代表面板的一个特定单元格(不是列,是单元格!)。因此,您的数据结构是列表的列表。
因此,有人可能会问:在此表示中,董事会的一列是什么?答案是:没有真正的数据结构可以称为板的列,简单的列可以抽象地看作:“内部列表相同位置的所有元素”。
因此,如果您想从您的电路板表示中提取一个特定的单元格,由几个坐标(行号、列号)标识,您必须将此信息“翻译”为您的数据结构的特定表示,即而不是在列表列表中表示。比如你想获取坐标为(3, 5)的单元格的内容,即第3行第5列,你应该这样推理:我可以直接访问第3行,因为它是“大”列表的第四个元素,但不是第 5 列,因为没有任何内容直接对应于它。
但是如果我可以访问第 3 行,例如使用 (nth 3 board)
,我得到的是与该行的单元格对应的列表,因此不需要获取列5,我可以只取这个列表的元素 5,我将得到坐标为 (3, 5) 的单元格的内容。因此,获取此列表的元素编号 5 就足够了,例如 (nth 5 (nth 3 board))
(即,因为 (nth 3 board)
返回该行的单元格列表,您从该列表中选择元素 5)。
我希望这对理解如何解决您的问题有用。
关于list - 返回列表中的特定元素 - LISP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58255091/