Wie zu verwenden Zähler im Schema
Ich versuche ein Programm zu schreiben, wo ein Arzt sieht nur 5 Patienten und dann das Programm beendet. Jetzt ist es nicht zu Ende und es hält Fragen für den nächsten Patienten. Ignorieren Sie die anderen in der Arzt-Treiber-loop-Verfahren. Ich hinzufügen, um zu zählen, sich an diesem Verfahren, aber ich denke, es geht zurück auf null, jedes mal. Wie kann ich dieses Problem beheben?
(define count 0)
(define (new-patient counter)
(if (= counter 5) (write-line 'doctor has seen 5 patients today so the day is now over)
(visit-doctor (ask-patient-name))))
(define (doctor-driver-loop name earlier-responses)
(newline)
(write '**)
(let ((user-response (read)))
(cond ((equal? user-response '(goodbye))
(write-line (list 'goodbye name))
(write-line '(see you next week))
(new-patient (+ 1 count)))
(else (write-line (reply (responses-list earlier-responses user-response) user-response))
(doctor-driver-loop name (responses-list earlier-responses user-response))))))
(define (visit-doctor name)
(write-line (list 'hello name))
(write-line '(what seems to be the trouble?))
(doctor-driver-loop name initial-earlier-response))
- Du bist nie zu aktualisieren
count
, so dass jedes mal, wenn Sie anrufennew-patient
Sie vorbei sind1
als argument.doctor-driver-loop
nehmen sollten der Graf als ein argument, und pass(+ 1 count)
wenn es eine Rekursion.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen, ersetzen Sie diese Zeile:
Durch diese beiden Zeilen:
In Ihrer aktuellen code
count
wird immer haben einen Wert von null für jede iterationdoctor-driver-loop
ist, weil Ihr Wert wurde nicht aktualisiert - die(+ 1 count)
Teil fügt mancount
ohne änderncount
, und das nächste maldoctor-driver-loop
aufgerufen,count
null wieder.Bewusst sein, dass dies eine schnelle Lösung, aber nicht die ideale Lösung. Für den Anfang
count
sollte nicht festgelegt werden, wie eine Globale variable, stattdessen sollte es einen parameter, um den Treiber Schleife, übergeben bekommt, mit einem Anfangswert von null und inkrementiert beim Aufrufnew-patient
mit jedem Patienten, der bekommt verarbeitet.(define count 0)
und von dort aus arbeiten.doctor-driver-loop
. Von diesem Zeitpunkt an vorbei um zu zählen, und aktualisieren Sie es, wenn nötig. Es ist schwer zu erklären, ohne auf den vollständigen code, aber es ist besser so - so kann man es herausfinden, indem Sie sich.