2016-09-10 3 views
0

Ich muss eine Funktion in Racket mit foldr schreiben, die eine Liste von Zahlen nehmen und Listenelemente entfernen, die größer als alle nachfolgenden Zahlen sind .Wie verwende ich foldr in Racket, um Zahlen in einer Liste zu eliminieren, die größer als alle nachfolgenden Zahlen sind

Beispiel: (-eliminieren größer (Liste 1 2 3 5 4)) sollte erzeugen (1 2 3 4)

Ich kann es ohne foldr zu verwenden oder irgendeine Funktionen höherer Ordnung, aber ich kann nicht heraus es aus mit foldr. Hier ist, was ich habe:

(define (eliminate-larger lst) 
    (filter (lambda (z) (not(equal? z null))) 
     (foldr (lambda (x y) 
      (cons (determine-larger x (rest lst)) y)) null lst))      
) 

(define (determine-larger value lst) 
    (if (equal? (filter (lambda (x) (>= x value)) lst) lst) 
     value 
     null) 
) 

bestimmen größere in einem Wert nehmen und eine Liste und diesen Wert zurück, wenn es größer oder gleich auf alle Elemente in der Liste ist. Wenn nicht, wird null zurückgegeben. Jetzt versucht die Eliminate-Larger-Funktion, durch die Liste zu gehen und jeden Wert weiterzuleiten, um ihn zu bestimmen, zusammen mit einer Liste jeder nachfolgenden Nummer. Wenn es ein "guter" Wert ist, wird es zurückgegeben und in die Liste eingefügt, wenn es keine Null ist. Am Ende werden die Nullen herausgefiltert. Mein Problem ist die Liste der Zahlen, die nach der aktuellen Nummer in der Foldr-Funktion folgen. Die Verwendung von "rest lst" funktioniert nicht, da es nicht rekursiv ausgeführt wird. Wie bekomme ich den Rest der Zahlen nach x in foldr?

Antwort

1

ich ich bin nicht Ihre Hausaufgaben für Sie wirklich hoffen, aber hier geht ...

Wie erhalte ich den Rest der Zahlen nach x in foldr?

Da Sie die Liste von rechts sind raubend, können Sie Ihren Akku strukturieren, so dass „der Rest der Zahlen nach x“ als memo Argument zur Verfügung stehen.

(define (eliminate-larger lst) 
    (foldr 
    (lambda (member memo) 
     (if (andmap (lambda (n) (<= member n)) memo) 
     (cons member memo) 
     memo)) 
    '() 
    lst)) 
(eliminate-larger (list 1 2 3 5 4)) ;; (1 2 3 4) 

Dies ist zugegebenermaßen eine naive Lösung, wie Sie den gesamten Akkumulator mit jeder Iteration zu durchqueren sind gezwungen, aber man kann einen maximalen Wert, zusätzlich zu Ihrem Memo, und vergleichen Sie dagegen jedes Mal durch leicht pflegen .

+0

das funktioniert, danke! Ich versuche zu lesen, wie und map funktioniert, aber ich folge nicht ganz dem, was es tut. –

+0

'andmap' wird verwendet, um zu überprüfen, dass' member' '' <= 'jedes Element in der Akkumulatorliste ist. Im Vergleich zur Verwendung einer Funktion wie "Filter" hat es den zusätzlichen Vorteil, dass es früh zurückkehrt, wenn _eine_Anwendung des gelieferten Prozesses "# f" (z. B. '(<= 5 4)') zurückgibt. – pdoherty926

+0

@KeithCalderwood Wenn Sie mit dieser Antwort zufrieden sind, würde es Ihnen etwas ausmachen, es anzunehmen? – pdoherty926

0

folgende Arbeiten:

(define (el lst) 
    (define (inner x lsti) 
    (if(empty? lsti) (list x) 
     (if(<= x (apply max lsti)) 
      (cons x lsti) 
      lsti))) 
    (foldr inner '() lst)) 

(el (list 1 2 3 5 4)) 

Ausgang:

'(1 2 3 4) 

Cond Version bevorzugt sein kann:

(define (el lst) 
    (define (inner x lsti) 
    (cond 
     [(empty? lsti) (list x)] 
     [(<= x (apply max lsti)) (cons x lsti)] 
     [else lsti] )) 
    (foldr inner '() lst)) 
Verwandte Themen