Схема удаления элемента первого экземпляра

Я хочу удалить первую встречу элемента в списке

пример

> (remove-first '(10 20 30 40 50 40 30 20 10) 10)
(20 30 40 50 40 30 20 10)
> (remove-first '(10 20 30 40 50 40 30 20 10) 40)
(10 20 30 50 40 30 20 10)
> (remove-first '("A" "B" "C" "d" "e" "F") "d")
("A" "B" "C" "e" "F")
> (remove-first '(10 20 30 40 50 40 30 20 10) 60)
(10 20 30 40 50 40 30 20 10)
> (remove-first (remove-first '(10 20 30 40 50 40 30 20 10) 40) 40)
(10 20 30 50 30 20 10)

но я не знаю, что мне не хватает в моем коде, может быть, я застрял в бесконечном цикле

(define remove-first
  (lambda (li num)
    (if
      (= num (car li))
    (else
      (remove-first (cdr li) num)
    )
    )
  )
)

1 ответ

Решение

Вам следует изучить стандартный шаблон для обхода входного списка и построения выходного списка в качестве ответа, одна и та же структура решения используется для многих задач, и ваш код в настоящее время не придерживается этого. Другие ошибки включают в себя:

  • Вам не хватает базового варианта - что произойдет, когда вы пройдете весь список?
  • Когда вы найдете элемент, то вы должны пропустить его и добавить остальную часть списка
  • Список может содержать цифры и строки, поэтому необходимо использовать equal? для сравнения, потому что = работает только для чисел
  • И, наконец, когда вызывается рекурсия, вы должны добавить текущий элемент в создаваемый список вывода.

Вот исправленная версия:

(define remove-first
  (lambda (li val)
    (cond ((null? li) '())
          ((equal? val (car li)) (cdr li))
          (else (cons (car li) (remove-first (cdr li) val))))))
Другие вопросы по тегам