Pregunta

Yo he estado haciendo algunas tareas, escribió el código y en realidad no puede encontrar la razón por la que no funciona.La idea principal de esta parte del trabajo es hacer una secuencia que me va a dar elementos de la serie de Taylor de la función coseno para un dado de X (ángulo supongo).de todos modos aquí está mi código, yo estaría feliz si alguien puede que me señale las razones por las que no funciona :)

(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

Sin embargo, esto no funciona, y no sé por qué.

Estoy usando el Dr. Esquema 4.2.5 con el idioma "fundamentos de Lenguajes de Programación 3ª ed".

¿Fue útil?

Solución

Como me sentía bien (y nostálgico por el esquema), en realidad me atravesé tu código para encontrar los errores. Por lo que puedo ver, hay 2 problemas que evitan que el código se ejecute como debería:

Si entiendo su código correctamente (force exp) debería evaluar exp, sin embargo, lo devuelve directamente (no evaluado). Por lo tanto, probablemente debería definirse como (define (force exp) (exp))

El segundo problema está en tu lambda: (lambda() ((tylorElementCosine x) (+ n 1)) ) Se evaluará en el siguiente elemento de la serie Taylor, mientras que debe evaluar en una transmisión. Probablemente quieras algo como esto: (lambda() (iter (+ n 1)) )

No he marcado si la salida es correcta, pero con esas modificaciones al menos se ejecuta. Entonces, si hay más problemas con el código, debe estar en la fórmula utilizada.

Sin embargo, sugeriría que la próxima vez que desee ayuda con su tarea, al menos nos díganos dónde se manifiesta exactamente el problema y qué ha intentado ya (la comunidad frunce el ceño en "Aquí hay algún código, por favor, arregléelo" ).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top