【发布时间】:2014-04-16 02:28:16
【问题描述】:
我正在使用方案 R5RS。
给定一个包含多个条目的列表,我想返回该列表直到给定元素的最后一次出现。
所以对于以下输入:
列表'("hi" "how" "are" "you")
关键字"you"
我想要以下输出:
列表'("hi" "how" "are")
我在 R5RS 方案中找不到具有此功能的功能,但也许我遗漏了一些东西。如果没有这样的功能,我该如何实现呢?
【问题讨论】:
我正在使用方案 R5RS。
给定一个包含多个条目的列表,我想返回该列表直到给定元素的最后一次出现。
所以对于以下输入:
列表'("hi" "how" "are" "you")
关键字"you"
我想要以下输出:
列表'("hi" "how" "are")
我在 R5RS 方案中找不到具有此功能的功能,但也许我遗漏了一些东西。如果没有这样的功能,我该如何实现呢?
【问题讨论】:
这比乍一看要复杂一些,但这应该可以:
(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")
=> '()
【讨论】:
如果您反转列表然后查找 first 出现,这可以非常简洁地完成:
(define (last lst key)
(define r (member key (reverse lst)))
(if r
(reverse (cdr r))
'()))
【讨论】: