所以我的代码正在删除元素的第一次出现
(delete 2 '(2 5 4 2 6))
现在我希望它删除元素,但从列表末尾开始,例如'(2 5 4 6)
将返回{{1}}
我真的不知道如何做到这一点,所以任何帮助都表示赞赏。
答案 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)