0

我正在使用方案 R5RS。

给定一个包含多个条目的列表,我想返回该列表直到最后一次出现给定元素。

所以对于以下输入:

一个列表'("hi" "how" "are" "you")
关键字"you"

我想要以下输出:
列表'("hi" "how" "are")

我在方案 R5RS 中找不到具有此功能的功能,但也许我遗漏了一些东西。如果不存在这样的功能,我将如何实现它?

4

2 回答 2

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")
=> '()
于 2014-04-16T02:58:11.853 回答
0

如果您反转列表然后查找第一次出现,这可以非常简洁地完成:

(define (last lst key)
  (define r (member key (reverse lst)))
  (if r 
      (reverse (cdr r))
      '()))
于 2014-04-16T04:43:14.247 回答