2016-07-23 4 views
-1

I eine Funktion schreiben möchte, dassHerstellung einer Liste in Schläger, mit einer Liste von Tages Structure

1- eine natürliche Zahl verbraucht (Intervall)

2- einen Zeitplan erzeugt, die eine Liste ist der Tagesstruktur als unten gezeigt.

Die Regel ist, die erzeugt für jede Liste, der Zeitplan beginnt bei (06.00), erhöht sich durch das gegebene Intervall und setzt dieses Intervall hinzuzufügen, bis es bei (6 PM-, die der 18. Stunde) endet und doesn geh nicht über diese Marke hinaus. Mit Hilfe der Datendefinition von:

(define-struct daytime (hours minutes)) 
    ;; A Daytime is a (make-daytime Nat Nat) 
    ;; requires the number that represents hours to be 6<= hours <= 18 
    ;; and requires the number that represents minutes to be < 60 

Das Problem, das ich habe, ist, wie ich Listen mit Tagesstruktur erstellen? Ich habe eine Liste erstellt, aber sie verwendet "list" anstelle von make-day. Ein Beispiel für dieses Programm sollte sein:

(schedule 90) gives 
    (list (make-daytime 6 0) (make-daytime 7 30) (make-daytime 9 0) 
      (make-daytime 10 30) (make-daytime 12 0) (make-daytime 13 30) 
      (make-daytime 15 0) (make-daytime 16 30) (make-daytime 18 0)) 
+0

Aber Sie alr eady hat die Liste erstellt, die wie gewünscht funktioniert! Versuchen Sie (definieren Sie meine Liste (liste (make-dayday 6 0) ....) dann können Sie versuchen (tagsüber (erste (meine-Liste))) was 6 ergibt. Wenn Sie mehr Sichtbarkeit wünschen, fügen Sie # hinzu : prefab zu deiner define-struct und du wirst die Details der vollständigen Liste sehen, wenn du sie druckst – MattAPiroglu

+0

Nein, das war ein Beispiel um dir zu zeigen, wie ich mein Programm laufen lassen möchtest Kannst du mir bitte helfen, dieses Programm zu schreiben? – Tiff

Antwort

1

Meinten Sie definieren eine Funktion, die diese Liste zurückkehren wird? Hmm, und das gewünschte Beispiel gibt dir die Intervalle von n Minuten.

Es gibt viele Möglichkeiten, dies zu schreiben, im Allgemeinen basierend auf Schleifen (rekursiv oder nicht). Wenn Sie eine for-Schleife verwenden möchten, benötigen Sie eine Folge von Werten, über die Sie iterieren können. Wenn Sie Rekursion verwenden, können Sie den Wert erhöhen, bis die Endbedingung erfüllt ist. Sie können einen Wert innerhalb einer for-Schleife inkrementieren, aber es verwendet Mutation und wird als ein schlechter Ansatz in der funktionalen Programmierung angesehen. Lassen Sie mich Ihnen den Weg von zwei Annäherungen zeigen, und lassen Sie einige feine Details zu Ihnen :)

Auch werde ich für/list für den Schleifenbetreiber wählen, da es nett eine Liste für uns zurückgibt.

for loop: Wie gesagt, wir müssen Werte durchlaufen, so dass wir eine Sequenzfunktion verwenden können, um die Werte zu erstellen. Lassen Sie uns verwenden (in-Bereich) Funktion für sie:

(sequence->list (in-range 0 (* 12 60) 90)) 

geben Sie die Minuten-Schritten:

'(0 90 180 270 360 450 540 630) 

Perfect, können wir daran arbeiten:

(define (schedule n) 
    (for/list ([val (sequence->list (in-range 0 (* 12 60) n))]) 
    (let ([hour 0] ; <== calculate the hour part here 
      [minute 0]) ; <== and minute here 
     (make-daytime hour minute)))) 

Nun, wenn Sie möchten dasselbe rekursiv machen:

(define (schedule.v2 n) 
    (define (schedule-aux result current-min) 
    (cond 
     [(>= current-min 720) result] 
     [else 
     (let ([hour 0] ; <== calculate the hour from current-min 
      [minute 0] ; <== calculate the min from current-min 
      [next-min (+ current-min n)]) 
     (schedule-aux 
      (cons (make-daytime hour minute) 
       result) 
      next-min))])) 
    (schedule-aux null 0)) 
Verwandte Themen