Удаление элемента DrRacket, начиная с конца списка - PullRequest
0 голосов
/ 13 июня 2018

Итак, у меня есть код, который удаляет первое появление элемента

(define delete
  (lambda (a lst)
    (cond
      ((null? lst) (lst))
      ((eq? (car lst) a) (cdr lst))
      (else (cons (car lst)
                  (delete a (cdr lst)))))))

Теперь я хочу удалить элемент, но начиная с конца списка, например, (delete 2 '(2 5 4 2 6)) вернет '(2 5 4 6)Я действительно не знаю, как это сделать, поэтому любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Это работа для 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)
0 голосов
/ 16 июня 2018

В этом ответе не используются мутации или множественные циклы.Вероятно, это похоже на то, на что ссылался ДжонКлемент в одном из своих комментариев.

Эти характеристики не делают его лучше или хуже других решений.Каждая реализация включает в себя компромисс, и хорошо думать об этом и просто знать о них

(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)
0 голосов
/ 13 июня 2018

Конечно, нет проблем:

#lang racket

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