Domanda

Ho fatto un po 'di compiti a casa, ha scritto del codice e non può effettivamente trovare il motivo per cui non funziona. L'idea principale di questa parte del lavoro è quello di realizzare un flusso che mi darà elementi della serie di Taylor della funzione coseno per un dato X (angolo immagino). In ogni modo qui è il mio codice, sarei felice se qualcuno mi potrebbe indicare le ragioni non funziona:)

(define (force exp) exp)
(define (s-car s) (car s))
(define (s-cdr s) (force (cdr s)))

; returns n elements of stream s as a list
(define (stream->list s n)
  (if (= n 0) 
      '()
      (cons (s-car s) (stream->list (s-cdr s) (- n 1)))))

; returns the n-th element of stream s
(define stream-ref (lambda (s n)
                     (if (= n 1)
                         (s-car s)
                         (stream-ref (s-cdr s) (- n 1)))))

; well, the name kinda gives it away :) make factorial n!
(define (factorial x)
        (cond ((= x 0) 1)
              ((= x 1) 1)
              (else (* x (factorial (- x 1))))))

; this function is actually the equation for the 
; n-th element of Taylor series of cosine
(define (tylorElementCosine x)
  (lambda (n)
     (* (/ (expt -1 n) (factorial (* 2 n))) (expt x (* 2 n)))))

; here i try to make a stream of those Taylor series elements of cosine
(define (cosineStream x)
  (define (iter n)
    (cons ((tylorElementCosine x) n)
          (lambda() ((tylorElementCosine x) (+ n 1)))))
  (iter 0))

; this definition should bind cosine
; to the stream of taylor series for cosine 10
(define cosine (cosineStream 10)) 
(stream->list cosine 10) 
; this should printi on screen the list of first 10 elements of the series

Tuttavia, questo non funziona, e non so perché.

Sto usando Dr.Scheme 4.2.5 con la lingua impostata su "Elementi essenziali di Linguaggi di programmazione 3rd Ed".

È stato utile?

Soluzione

Dal momento che mi sentivo bello (e nostalgia schema) in realtà ho guadato attraverso il codice per finde gli errori. Da quello che posso vedere ci sono 2 problemi che mantiene il codice di esecuzione come dovrebbe:

Se ho capito il codice correttamente (force exp) dovrebbe valutare exp, tuttavia si torna direttamente esso (non valutata). Quindi probabilmente dovrebbe essere definito come (define (force exp) (exp))

Il secondo problema è nella tua lambda: (lambda() ((tylorElementCosine x) (+ n 1)) ) valuterà al successivo elemento della serie di Taylor, mentre dovrebbe valutare in un flusso. Probabilmente si desidera qualcosa di simile: (lambda() (iter (+ n 1)) )

Non ho controllato se l'uscita è corretta, ma con quelle modifiche lo fa almeno run. Quindi, se ci sono più problemi con il codice dovrebbe essere nella formula utilizzata.

Comunque io suggerirei che la prossima volta che si desidera aiuto con i compiti a casa voi almeno dirci dove esattamente manifesti problema e ciò si è tentato già (la comunità fa cipiglio sul "qui è un codice, si prega di risolvere il problema per me" tipo di domande).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top