DrRacket从列表末尾开始删除元素

时间:2018-06-13 01:26:51

标签: scheme racket

所以我的代码正在删除元素的第一次出现

(delete 2 '(2 5 4 2 6))

现在我希望它删除元素,但从列表末尾开始,例如'(2 5 4 6)将返回{{1}} 我真的不知道如何做到这一点,所以任何帮助都表示赞赏。

3 个答案:

答案 0 :(得分:2)

当然,没问题:

#lang racket

(define (delete-last a lst) 
   (reverse (delete a (reverse lst))))

答案 1 :(得分:0)

这是foldr的作业:

(define (remove-from-end v xs)
   (let ((flag #t))
     (foldr (lambda (x r)
               (if (and flag (equal? v x)) 
                     (begin (set! flag #f) 
                            r)
                     (cons x r)))
            '() xs)))

测试:

> (remove-from-end 2 '(2 5 4 2 6))
'(2 5 4 6)

答案 2 :(得分:0)

这个答案不使用突变或多个循环。这可能类似于JohnClements在他的一条评论中提到的内容。

这些特征并不比其他解决方案更好或更差。每个实现都涉及权衡,考虑这些并且只是意识到它们是好的

(define (delete-last a lst)
  (define (loop lst return)
    (if (null? lst)
        (return null #t)
        (loop (cdr lst)
              (lambda (rest untouched?)
                (if (and untouched? (eq? a (car lst)))
                    (return rest #f)
                    (return (cons (car lst) rest) untouched?))))))
  (loop lst (lambda (result _) result)))

(delete-last 'a '(a b c a d e f g a h i a j k l))
;; '(a b c a d e f g a h i j k l)