2016-05-22 9 views
2

Ich habe ein paar Hausaufgaben, dass ich ein bisschen verloren bin. Bei einem Strom natürlicher Zahlen sollte ich in der Lage sein, einen neuen Strom (zweimal Strom) zu erzeugen, bei dem alle Elemente mit zwei multipliziert werden.Multiplikation eines Streams in Petite Schema

(define stream-of-natural-numbers 
    (letrec ([produce (lambda (current-natural-number) 
        (cons current-natural-number 
         (lambda() 
          (produce (1+ current-natural-number)))))]) 
(produce 0))) 

Ich kam mit dem folgenden Code, aber nichts scheint zu funktionieren und ich bin jetzt verloren.

(define twice-the-stream 
    (lambda (n) 
     (letrec ([produce (lambda (current next) 
           (cons (* 2 current) 
            (lambda() 
             (produce (current next) (force (next))))))]) 
    (produce (car n) (force (cdr n)))))) 

(zweimal-the-Stream Stream-of-natural-Nummern)

Was bin ich?

Antwort

1
(define twice-the-stream 
    (lambda (n) 
     (letrec ([produce (lambda (current next) 
           (cons (* 2 current) 
            (lambda() 
             (produce (current next) (force (next))))))]) 
           ;; this is wrong: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
    (produce (car n) (force (cdr n)))))) 

Sie haben bereits die (cdr n) an diesem Punkt erzwungen; jetzt next ist keine Funktion, es ist ein Strom - ein Nachteil Paar seine aktuelle Nummer und seine Stream-Tail.

current ist auch keine Funktion. Es ist eine Nummer, die bereits verwendet wird, um die doppelte Nummer über diesem Anruf zu erzeugen.

die kognitive Belastung zu verringern, benennen Sie die Variablen, die Sie daran zu erinnern, was sie sind,

(define twice-the-stream 
    (lambda (numbers-stream) 
     (letrec ([produce (lambda (current-num next-str) 
           (cons (* 2 current-num) 
            (lambda() 
             (produce (current-element next-str) 
               (force (next-elements next-str))))))]) 
    (produce (car numbers-stream) (force (cdr numbers-stream)))))) 

und jetzt können Sie sehen, dass Sie durch übermäßig suggestive (und unter ausgeprägten Schwerpunkt) Namensgebung verwechselt wurde, in Ihrer Meinung "aktuelle" Nummer mit "aktuelle Nummer" Funktion und "nächste" Stream mit "Next Stream" -Funktion zusammenfließen. Durch Aufbrechen des Spruchs ist nun klar, was getan werden muss, um die beiden produce Anrufe synchron zu bringen.

übrigens, wenn Sie kürzeren Variablennamen in erster Linie benutzt haben, ns für „einen Strom von Zahlen“, n für „eine Zahl“, s für „einen Strom“, dann würden Sie haben eine etwas weniger Chance zu verwirren,

(define twice-the-stream 
    (lambda (ns) ;; a numbers stream 
     (letrec ([produce (lambda (n s) ; a number, and a stream 
           (cons (* 2 n) ; a number, doubled 
            (lambda() ; a stream, repackaged: 
             (produce (.... s) ; _its_ 1st element 
               (force (.... s))))))]) ; and the rest 
    (produce (car ns) (force (cdr ns)))))) 

so zu tun, was man eigentlich tun (angeblich) zu - dh mit beschreibenden Namen (aber nicht aussagekräftig genug) - ist, was Sie haben in dieses Problem an erster Stelle!


angeblich nicht eine gute Sache - aber solange sie in den Kommentaren klar beschrieben werden, sehe ich nicht, warum das so sein sollte.