2017-12-19 8 views
1

Ich lerne Schema und ich würde gerne wissen, wie zu entfernen, zum Beispiel die negativen Zahlen einer Liste, so dass ich mit den positiven arbeiten kann, bis jetzt habe ich nur # statt Entfernen der Negative. Hier ist mein Code:Wie mit bestimmten Zahlenbereichen in Listen im Schema arbeiten?

(define test 
    (lambda (list) 
     (map (lambda (x) (if (> x 0) x))list))) 
+1

Sie können [Filter] (https://docs.racket-lang.org/reference/pairs.html?q=filter#%28def._%28%28lib._racket%2Fprivate%2Flist..rkt%) verwenden. 29._filter% 29% 29). – Renzo

+0

@Renzo Ich weiß, aber ich benutze eine vorherige Version davon, weil mein College nicht anpassen wird. Also versuche ich es auf diese Weise. –

+0

Ich verwende Version 372 des Schemas. –

Antwort

1

ich die Negative der Liste verwandelte sich in 0, damit es nicht beeinflussen, was ich tue.

Hier ist der Code dafür:

(define test 
    (lambda(list) 
     (map (lambda (x)(if (> x 0) x 
        0))list) )) 
+0

gute Idee, wenn Sie nach einem Maximum suchen. mit minimum, nicht so gut. :) Aber du kannst noch ein bisschen weiter gehen: verwandle jedes positive 'x' in' (list x) ', und jedes negative' x' wird in '(list)' (ohne das 'x', dh das leere Liste). Als nächstes '(apply append ...)' an die resultierende Liste von Listen (wo einige Singleton-Listen sind und andere leer sind). Was wird das Ergebnis sein? (Beispiel: try '(apply append (list '(1)'() '(3)))). –

1

Sie müssen die Liste Element für Element disect und wieder aufzubauen. Dies ist ein sehr häufiges rekursives Muster in Scheme und sollte in Ihrem Kursmaterial vertieft werden.

(define (filter list pred) 
    (cond ((null? list) 
      '()) 
     ((pred (car list)) 
      (filter (cdr list) pred)) 
     (else 
      (cons (car list) (filter (cdr list) pred))))) 
+0

Sie können Ihre Version mehr in Übereinstimmung mit dem eingebauten 'Filter' machen, indem Sie alle Elemente einbeziehen, deren Prädikatwert wahr ist (anstelle des Gegenteils). – assefamaru

+0

Code ist schön und sauber, aber - Liste ist ein [Schema-Schlüsselwort] (http://community.schemewiki.org/?scheme-keywords) - es sollte nie als Name eines Arguments verwendet werden – ghosh

2

Hier ist die Standardversion von filter:

(define (filter pred? xs) 
    (let loop ((xs xs) (ys '())) 
    (cond ((null? xs) (reverse ys)) 
      ((pred? (car xs)) 
      (loop (cdr xs) (cons (car xs) ys))) 
      (else (loop (cdr xs) ys))))) 

Damit Sie nur die positiven Werte der Eingangsliste enthält eine neue Liste erstellen können:

> (filter positive? '(3 9 -2 4 0 -1 7)) 
(3 9 4 7) 

Das könnte dir Genießen Sie my blog, die Ihnen eine Menge Scheme-Code zum Studieren bietet.

Verwandte Themen