Схема удаления элемента первого экземпляра
Я хочу удалить первую встречу элемента в списке
пример
> (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))))))