2016-04-03 3 views
1

Ich versuche, eine Art Einkaufsliste/Warteschlange Art der Funktion zu implementieren. Die Funktion, mit der ich einige Probleme habe, ist removeByPriority. Ich möchte eine Nummer und eine Liste eines zu entfernenden Artikels eingeben. Wenn sie nicht in der Liste enthalten ist, geben Sie die Liste einfach zurück, aber wenn sie in der Liste enthalten ist, entfernen Sie sie und geben Sie eine Liste mit den aktualisierten Prioritäten zurück.Schema: Entfernen von etwas aus einer Liste und Aktualisieren von Prioritäten

Zum Beispiel (removePriority 2 Shopping-Liste) zurückkehren würde:

=> (("Apple" 3) ("Milk" 2) ("Eggs" 1)) 

Ich habe einige Hilfsfunktionen erstellt, die Arbeit zu tun, und kann erfolgreich überprüfen, ob eine bestimmte Priorität ist oder nicht in der Liste aber ich stecke da fest.

#lang scheme 

(define shopping-list '(("Apple" 4) ("Orange" 2) ("Milk" 3) ("Eggs" 1))) 

(define name (lambda (m) 
       (car m) 
       )) 

(define priority (lambda (m) 
        (car (cdr m)) 
        )) 

(define containsPriority 
    (lambda (k lst) 
    (cond 
     ((null? lst)#f) 
     ((equal? k (priority (car lst)))#t) 
     (else (containsPriority k (cdr lst))) 
    ) 
    ) 
) 

(removeByPriority k lst) 

(define removeByPriority 
    (lambda (k lst) 
    (if((not(containsPriority k lst))lst) 
     (equal? k (priority(car lst))) 
      (else(removeByPriority k (cdr lst))(cons (car lst))) 
     ) 
    ) 
    ) 

(removeByPriority 2 shopping-list) 
+1

In Ihrem Beispiel , '" Eggs "sollte eine Priorität von" 0 "haben, weil alle Prioritäten dekrementiert werden sollten, oder? –

+0

In diesem Fall reduziere ich nur die Prioritäten, wenn sie größer sind als die entfernte. – user2411290

Antwort

3

Sie sollten versuchen, bestehende Verfahren wann immer möglich zu verwenden, auch ein paar Ihrer Verfahren können ein wenig mehr vereinfacht werden. Für den Anfang sind diese einfacher und entspricht dem, was Sie geschrieben haben:

(define name car) 
(define priority cadr) 

(define (containsPriority k lst) 
    (cond ((null? lst) #f) 
     ((equal? (priority (car lst)) k) #t) 
     (else (containsPriority k (cdr lst))))) 

Hier ist der interessante Teil. Nach der Überprüfung wir den Wert auswählen, die wir nicht wollen und danach wir Karte über der Ergebnisliste, die Prioritäten abnehmend:

(define (removeByPriority k lst) 
    (if (not (containsPriority k lst)) 
     lst 
     (map (lambda (pair) 
      (list (name pair) 
        (if (< (priority pair) k) 
         (priority pair) 
         (sub1 (priority pair))))) 
      (filter-not (lambda (pair) 
         (equal? (priority pair) k)) 
         lst)))) 

Es wie gewünscht funktioniert:

(define shopping-list '(("Apple" 4) ("Orange" 2) ("Milk" 3) ("Eggs" 1))) 
(removeByPriority 2 shopping-list) 
=> '(("Apple" 3) ("Milk" 2) ("Eggs" 1)) 
+0

Sehr hilfreich! Ich muss nur sehen, wie ich Prioritäten erreichen kann, die niedriger sind als die, die ich entferne, um gleich zu bleiben. Vielen Dank! – user2411290

+0

Beste Antwort in der Tat! Sehr geschätzt!! – user2411290

+0

Nur ein paar Fragen für meine eigene Klarheit. Ich bin nicht vertraut mit Sub1 und Filter-nicht. Ich nehme an, Sub1 ist nur ein Funktionsname? Ist "filter-not" auch eine bestimmte Schema-Funktion? Edit: Sub1 bedeutet nur Subtraktion 1. Ich verstehe das. – user2411290

Verwandte Themen