3 votes

Comment supprimer un élément d'une liste en schéma

Comment supprimer un élément d'une liste ex:- list=[1 2 3 4]

J'ai créé un code, mais je pense que je me suis trompé quelque part.

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

12voto

Lucky Luke Points 150

Votre code est presque correct. Le site item doit également être un paramètre, de sorte que la fonction peut commencer comme ceci :

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

De plus, votre code a besoin d'un paren autour du cdr list y else dans la dernière clause. Alors, le code peut être comme ceci :

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

4voto

tisyang Points 43

Shido Takafumi a écrit un tutoriel sur Scheme, Encore un autre tutoriel sur les schémas . Sur chapitre 7 exercice 1, le 3ème problème.

Une fonction qui prend une liste (ls) et un objet (x) comme arguments et qui retourne une liste supprimant x de ls.

L'auteur a donné le code de la solution en bas de la page.

; 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))))))

Le code peut être difficile à comprendre pour un débutant. C'est le même que le code ci-dessous.

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

Cela peut supprimer les mêmes éléments dans la liste :D

1voto

Jie Points 167

1) si vous considérez que la liste d'entrée peut être une liste simple, ou que vous voulez juste supprimer l'élément au niveau supérieur d'une liste imbriquée. par exemple :

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)

comme nous pouvons le voir dans le deuxième exemple ci-dessus, il supprime simplement l'élément au niveau supérieur de la liste imbriquée, dans la liste interne, il ne le modifie pas.

ce code devrait être :

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

2) si l'on considère que la liste d'entrée peut être une liste imbriquée

par exemple :

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

et supprimer l'élément 2 dans la liste d'entrée

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

et le code devrait être :

(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)))
))

0voto

Jarvis Points 2536

Ce code semble fonctionner parfaitement, mais ne supprime qu'un élément qui devrait être dans la liste :

(define (delete element lst)
    (let loop ([temp lst])
        (if (= element (car temp)) (cdr temp)
            (cons (car temp) (loop (cdr temp))))))

-3voto

Mafas Points 1
(define (deleteItem(list item))
    (cond
    ((eq ? item (car(list)))cdr(list))
    (cons(car(list)(deleteItem(cdr list)))
    )
)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X