list - 返回列表中的特定元素 - LISP

标签 list lisp common-lisp element

我正在尝试编写一个名为: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/

相关文章:

C - 链表for循环疑问

lisp - 在 AutoLISP 中是否可以在函数体中获取函数名称?

common-lisp - setf 如何在幕后工作?

在普通的 lisp 中排序子列表

java - 无法实例化 [java.util.List] : Specified class is an interface in GET request

python - 编译列表 : python best practice

formatting - 我如何在普通的 lisp 中格式化一个列表?

emacs - 内置 Emacs Lisp 库中此函数的名称?

lisp - 在 Lisp (CLOS) 中访问槽的问题

c# - 转换为 List<T> 以返回函数