如何在列表中最后一次出现元素之前获取列表?

时间:2014-04-16 02:28:17

标签: scheme r5rs

我正在使用方案R5RS。

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

所以对于以下输入:

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

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

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

2 个答案:

答案 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))
      '()))
相关问题