Как удалить элемент из списка в схеме - PullRequest
3 голосов
/ 15 декабря 2009

как удалить элемент из списка пример: - список = [1 2 3 4]

Я придумал какой-то код. Я думаю, что где-то ошибся.

 (define delete item
   (lambda (list)
   (cond
    ((equal?item (car list)) cdr list)
     (cons(car list)(delete item (cdr list))))))

Ответы [ 5 ]

11 голосов
/ 15 декабря 2009

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

(define delete
  (lambda (item list)
  ...

Кроме того, ваш код нуждается в скобках вокруг cdr list и else в последнем пункте. Тогда код может быть таким:

(define delete
  (lambda (item list)
    (cond
     ((equal? item (car list)) (cdr list))
     (else (cons (car list) (delete item (cdr list)))))))
3 голосов
/ 22 февраля 2013

Шидо Такафуми написал учебник о Схеме, Еще один учебник Схем В главе 7 , упражнение 1, 3-я задача.

Функция, которая принимает список (ls) и объект (x) в качестве аргументов и возвращает список, удаляющий x из ls.

Автор дал код решения внизу страницы.

; 3
(define (remove x ls)
  (if (null? ls)
      '()
      (let ((h (car ls)))
        ((if (eqv? x h)
            (lambda (y) y)
            (lambda (y) (cons h y)))
         (remove x (cdr ls))))))

Код может быть трудно понять для начинающих. Это так же, как код ниже.

(define (rm x ls)
  (if (null? ls)
      '()
      (if (eqv? x (car ls))
          (rm x (cdr ls))
          (cons (car ls)
                (rm x (cdr ls))))))

Это может удалить те же элементы в списке. : D

1 голос
/ 04 ноября 2014

1) если рассмотреть входной список, может быть простой список, или вы просто хотите удалить элемент на верхнем уровне вложенного списка например:

delete 2 from (1 2 3 4) will return (1 2 3)
delete 2 from (1 2 3 (2 3) 3 2 4) will return (1 3 (2 3) 3 4)

Как мы видим во втором примере выше, он просто удаляет элемент на верхнем уровне вложенного списка, во внутреннем списке, мы не меняем его.

этот код должен быть:

(define (deleteitem list1 item) 
( cond
    ((null? list1) ’())
    ((equal? (car list1) item) (deleteItem (cdr list1) item)) 
    (else (cons (car list1) (deleteitem (cdr list1) item)))
))

2) если рассмотреть входной список, может быть вложенный список

например:

input list: (1 2 3 (3 2 (2 4 (2 5 6) 2 5 6) 2 4) 2 3 (2 3 4))

и удалить элемент 2 из списка ввода

the output list should be: (1 3 (3 (3 (5 6) 5 6) 4) 3 (3 4))

и код должен быть:

(define (delete2 list1 item) 
    ( cond
    ((null? list1) '())
    ((pair? (car list1)) (con (delete2 (car list1) item) (delete2 (cdr list1) item)))
    ((equal? (car list1) item) (delete2 (cdr list1) item)) 
    (else (cons (car list1) (delete2 (cdr list1) item)))
))
0 голосов
/ 27 февраля 2016

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

(define (delete element lst)
    (let loop ([temp lst])
        (if (= element (car temp)) (cdr temp)
            (cons (car temp) (loop (cdr temp))))))
0 голосов
/ 20 апреля 2010
(define (deleteItem(list item))
    (cond
    ((eq ? item (car(list)))cdr(list))
    (cons(car(list)(deleteItem(cdr list)))
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...