2017-04-15 2 views
0

Je souhaite écrire une fonction qui reçoit une liste et renvoie une liste de chaque élément. Par exemple: get - (x 3 4 5 (x 4) 3 x (6))) et recevez: (x (x) x())Schéma: Recherche d'un élément dans une liste et sous-liste

(define (lookForX lst) 
    (cond 
    ((null? lst) '()) 
    ((eq? (car lst) 'x) (cons (car lst) (lookForX (cdr lst)))) 
    (else (lookForX (cdr lst))))) 

mon code résultat pour:

(lookForX '(x 3 4 5 (x 4) 3 x (6))) 
-> (x x) 

Qu'est-ce que je fais mal?

Répondre

0

En fonction de votre choix que vous cherchez seulement pour x comme élément dans la liste et que vous ne faites pas des sous-listes:

(define (filter-x lst) 
    (cond 
    ((null? lst) '()) 
    ((eq? (car lst) 'x) 
    (cons (car lst) 
      (filter-x (cdr lst)))) 
    ((pair? (car lst)) 
    (cons (filter-x (car lst)) 
      (filter-x (cdr lst)))) 
    (else (filter-x (cdr lst))))) 

(filter-x '(x 3 4 5 (x 4) 3 x (6))) 
; ==> (x (x) x()) 

Avis Je retitré ce d'être plus Lisp comme. Le code Lisp n'utilise généralement pas camelCase mais lisp-case. Vous pouvez le faire plus général:

(define (filter-tree predicate? lst) 
    (cond 
    ((null? lst) '()) 
    ((predicate? (car lst)) 
    (cons (car lst) 
      (filter-tree predicate? (cdr lst)))) 
    ((pair? (car lst)) 
    (cons (filter-tree predicate? (car lst)) 
      (filter-tree predicate? (cdr lst)))) 
    (else (filter-tree predicate? (cdr lst))))) 

(define (filter-tree-x lst) 
    (filter-tree (lambda (v) (eq? v 'x)) lst)) 

(filter-tree-x '(x 3 4 5 (x 4) 3 x (6))) 
; ==> (x (x) x()) 

(define (filter-tree-numbers lst) 
    (filter-tree number? lst)) 

(filter-tree-numbers '(x 3 4 5 (x 4) 3 x (6))) 
; ==> (3 4 5 (4) 3 (6)) 
+0

Merci! Ça m'a aidé! – user2953423