lisp - 所有匹配元素在列表中的位置

标签 lisp common-lisp

我正在尝试在 Common Lisp 中编写一个类似于内置位置函数的函数,它返回大海捞针中与针匹配的所有元素的位置列表,而不是仅返回第一个元素。我想出了一些可能的解决方案(例如,在位置上使用 cdr-from 函数递归搜索下一个元素并将结果添加到前一个位置)但到目前为止我没有想出任何方法显得格外优雅。

任何人都可以建议什么是解决这个问题的最佳方法,因为我目前正在努力。

最佳答案

解决这个问题的明显方法就是依次查看列表中的每个元素,每次比较等于指针时,将其位置收集到输出列表中。在这种情况下获取位置非常容易,因为我们是从 haystack 的开头开始; 我们可以使用一个变量从 0 开始计算当前位置。

因此,如果我们用一句话描述完整的算法,我们会说类似“在大海捞针中找到针的所有位置,对于大海捞针中的每个元素,以及从 0 开始的位置,当元素等于针,收位置。”

当您想进行迭代处理时,LOOP 工具基本上是正确的选择。尽管它的语法复杂到 describe formally,经过一些experience您几乎可以将算法的英文描述放在 LOOP 的主体中,它就会起作用。

(defun all-positions (needle haystack)
  (loop
    for element in haystack 
    and position from 0
     when (eql element needle)
      collect position))

关于lisp - 所有匹配元素在列表中的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4439326/

相关文章:

error-handling - Common Lisp异常后如何继续正常执行?

lisp - 嵌入式方案解释器

lisp - 使用 lisp 简化一个简单的 bool 表达式

lisp - 检查子列表中具有值的关键字的出现

scheme - 将列表的元素配对在一起

lisp - Mapcar 和 assoc

functional-programming - 为什么这不在 Scheme 中评估?

arrays - 通用 Lisp : convert between lists and arrays

clojure - 构建 LISP 机器需要多少原语?十、七还是五?

common-lisp - 如何使用 CL 实现 `tail` 命令?