我正在使用方案R5RS。
给定一个包含多个条目的列表,我想将该列表返回到给定元素的最后一次出现。
所以对于以下输入:
列表'("hi" "how" "are" "you")
关键字"you"
我想要以下输出:
列表'("hi" "how" "are")
我无法在方案R5RS中找到具有此功能的功能,但也许我遗漏了一些东西。如果不存在这样的功能,我将如何实现它?
答案 0 :(得分:2)
这比初看起来有点棘手,但这应该有效:
(define (last lst key)
(cond ((null? lst) '())
((member key (cdr lst))
(cons (car lst) (last (cdr lst) key)))
(else '())))
关键的见解是你应该使用member
来检查元素是否仍然存在于列表中(这将告诉我们何时找到它的最后一次出现)。您还应该考虑两种特殊情况 - 如果列表为空,或者密钥不在列表中会发生什么?在这两种情况下,我都会返回一个空列表。例如:
(last '("hi" "how" "are" "you") "you")
=> '("hi" "how" "are")
(last '("hi" "how" "are" "how" "you") "how")
=> '("hi" "how" "are")
(last '("hi" "how" "are" "how" "you") "today")
=> '()
(last '() "empty")
=> '()
答案 1 :(得分:0)
如果您反转列表然后查找第一个事件,这可以非常简洁地完成:
(define (last lst key)
(define r (member key (reverse lst)))
(if r
(reverse (cdr r))
'()))