Как я могу получить список до последнего вхождения элемента из списка?

Я использую схему R5RS.

Учитывая список с несколькими записями, я хотел бы вернуть этот список до последнего появления данного элемента.

Итак, для следующего ввода:

Список '("hi" "how" "are" "you")
Ключевое слово "you"

Мне нужен следующий результат:
Список '("hi" "how" "are")

Мне не удалось найти в схеме R5RS функцию с такой возможностью, но, возможно, я что-то упускаю. Если такой функции не существует, как мне ее реализовать?


person Kittenmittons    schedule 16.04.2014    source источник


Ответы (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")
=> '()
person Óscar López    schedule 16.04.2014
comment
Большой! мне было приятно :) - person Óscar López; 16.04.2014

Это можно сделать довольно быстро, если вы перевернете список и затем посмотрите на первое вхождение:

(define (last lst key)
  (define r (member key (reverse lst)))
  (if r 
      (reverse (cdr r))
      '()))
person uselpa    schedule 16.04.2014