2017-09-22 1 views
0

Ich versuche, ein Element in einer Liste von Listen zu finden und die Listen, die dieses Element enthalten, zu drucken.So suchen Sie nach einem Element in einer Liste von Listen in Schläger

Für den Test: (Suchtabelle '((1 2 3) (4 2), (3 3 4) (5 3 2 1)) 1), der Ausgang ist:

' ((1 2 3) (5 3 2 1))

Dies ist mein Code in DrRacket so weit:

(define (search-table table item) 
    (if(equal? table null) 
    '() 
    (cons(search-table first table item))(search-table rest table item))) 

Aber dieser Code gibt mir eine Fehlermeldung, die besagt:

wenn: schlechte Syntax ; hat 4 Teile nach Schlüsselwort in: (if (gleiche? Tabelle null) (quote()) (Nachteile (Suche Tabelle ersten Tabellenelement)) (Suche Tabelle Rest Tabelle Element))

Bitte helfen Sie mir damit da ich Racket sehr neu bin.

Antwort

1

Wenn der Wert ein member der Liste ist, cons die Liste auf das Ergebnis

(define (search-table lists value) 
    (cond ((null? lists) '()) 
     ((member value (car lists)) (cons (car lists) (search-table (cdr lists) value))) 
     (else (search-table (cdr lists) value)))) 

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a) 
;; '((a b c d) (a b c)) 

du tho getaggt mit Schwanz-Rekursion so machen wir es mit einem konstanten Raum tun

(define (search-table lists value) 
    (let loop ((lists lists) (acc null)) 
    (cond ((null? lists) acc) 
      ((member value (car lists)) (loop (cdr lists) (cons (car lists) acc))) 
      (else (loop (cdr lists) acc))))) 

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a) 
;; '((a b c) (a b c d)) 

Aber dieses Ergebnis ist in umgekehrt Ordnung; sowieso entsprechend Ihrer Frage - wir können „reparieren“, dass eine Fortsetzung als unser Speicher anstelle einer Liste

(define (search-table lists value) 
    (let loop ((lists lists) (acc identity)) 
    (cond ((null? lists) 
      (acc null)) 
      ((member value (car lists)) 
      (loop (cdr lists) (lambda (rest) 
           (acc (cons (car lists) rest))))) 
      (else 
      (loop (cdr lists) acc))))) 

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a) 
;; '((a b c d) (a b c)) 

Sie markiert diese mit Funktions-Programmierung tho, also lassen Sie uns tun es höherer Ordnung mit Funktionen

(define (search-table lists value) 
    (filter (lambda (list) (member value list)) 
      lists)) 

(search-table '((a b c d) (b c) (c d e f) (a b c)) 'a) 
;; '((a b c d) (a b c)) 
Verwandte Themen