Схема потоков с рядами Тейлора

Я делал домашнее задание, написал код и на самом деле не могу найти причину, по которой он не работает. Основная идея этой части работы - создать поток, который даст мне элементы ряда Тейлора функции косинуса для заданного X (я полагаю, угла). в любом случае вот мой код, я был бы рад, если бы кто-нибудь мог указать мне причины, по которым он не работает :)

(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

Однако это не работает, и я не знаю почему.

Я использую Dr.Scheme 4.2.5 с языком, установленным на "Основы языков программирования, 3-е изд".


person Eugene Krapivin    schedule 10.01.2012    source источник
comment
И вы думаете, что это не работает - точное описание неисправности? Как именно не работает? Вы пробовали его отладить?   -  person Grizzly    schedule 10.01.2012
comment
да, я этого не делал, и это не сбой, если код существует, и 90% его работает как шарм, и существуют только 2 логические ошибки ... нет ошибки :)   -  person Eugene Krapivin    schedule 10.01.2012


Ответы (1)


Так как я чувствовал себя хорошо (и ностальгировал по схеме), я действительно пробирался через ваш код, чтобы найти ошибки. Из того, что я вижу, есть 2 проблемы, из-за которых код не работает должным образом:

Если я правильно понимаю ваш код, (force exp) должен оценивать exp, однако вы его напрямую возвращаете (без оценки). Так что его, вероятно, следует определить как (define (force exp) (exp))

Вторая проблема заключается в вашей лямбде: (lambda() ((tylorElementCosine x) (+ n 1)) ) будет оценивать следующий элемент ряда Тейлора, тогда как он должен оценивать поток. Вы, вероятно, захотите что-то вроде этого: (lambda() (iter (+ n 1)) )

Я не проверял, верен ли вывод, но с этими изменениями он, по крайней мере, работает. Поэтому, если с кодом возникнут еще какие-то проблемы, это должно быть в используемой формуле.

Однако я бы посоветовал, чтобы в следующий раз, когда вам понадобится помощь с домашним заданием, вы хотя бы сказали нам, где именно проявляется проблема и что вы уже пробовали (сообщество не одобряет вопросов типа «вот какой-то код, пожалуйста, исправьте его для меня» ).

person Grizzly    schedule 10.01.2012
comment
спасибо, это сработало как шарм ... я плохо отношусь к обеим ошибкам :) извините за неубедительный стиль вопроса, впервые я попросил помощи здесь ... Я редко прошу помощи в программировании, так как я преподаю C в моем колледже как репетитор ... большое спасибо! На самом деле я сделал первую ошибку, пытаясь исправить единственную ошибку, которая была у меня, это лямбда-выражение ... - person Eugene Krapivin; 10.01.2012
comment
@nocgod: Нет проблем со стилем вопроса, я просто должен был упомянуть об этом, так как те вопросы, которые в основном говорят о том, что у меня проблема, пожалуйста, помогите мне, как правило, не так приветствуются (по очевидным причинам это звучит так, как будто, пожалуйста, делайте всю мою работу) . Так что в будущем вы сможете лучше сформулировать свой вопрос;) - person Grizzly; 10.01.2012