我正在尝试在 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/