我正在尝试在Common Lisp中编写一个类似于内置位置函数的函数,该函数返回大海捞针中与指针匹配的所有元素的位置列表,而不是第一个.我想出了一些可能的解决方案(例如,使用位置上的cdr-from函数递归搜索下一个元素并将结果添加到前一个位置)但是到目前为止我没有提出任何方法看起来特别优雅.
任何人都可以建议什么是接近这个的最佳方式,因为我目前正在努力.
解决问题的显而易见的方法是依次查看列表中的每个元素,并且每次比较等于针将其位置收集到输出列表中.在这种情况下获得这个位置非常容易,因为我们从大海捞针开始; 我们可以使用变量来计算从0开始的当前位置.
因此,如果我们在一个句子中描述完整的算法,我们会说"找到大海捞针中的所有位置,大海捞针中的每个元素,以及从0开始的位置,当元素等于针,收集位置."
当您想要进行迭代处理时,LOOP工具基本上是正确的.尽管它的语法形式上很难形容,但经过一些经验之后,你几乎可以将算法的英语描述放在LOOP的主体中,它会起作用.
(defun all-positions (needle haystack)
(loop
for element in haystack
and position from 0
when (eql element needle)
collect position))