Потоки схемы с серией Тейлора
-
26-10-2019 - |
Вопрос
Я делал домашнее задание, написал какую -то код и не могу найти причину, по которой он не работает. Основная идея этой части работы состоит в том, чтобы сделать поток, который даст мне элементы серии косинусных функций Тейлора для данного 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 -е изд».
Решение
Поскольку я чувствовал себя хорошо (и ностальгию по схеме), я действительно пробирался через ваш код, чтобы найти ошибки. Из того, что я вижу, есть 2 проблемы, которые не дают коду от работы как следует:
Если я правильно понимаю ваш код (force exp)
должен оценить exp
, однако вы напрямую возвращаете его (не оценили). Так что, вероятно, следует определить как (define (force exp) (exp))
Вторая проблема в вашей лямбде: (lambda() ((tylorElementCosine x) (+ n 1)) )
оценимся до следующего элемента серии Тейлора, в то время как он должен оценить поток. Вы, наверное, хотите что -то подобное: (lambda() (iter (+ n 1)) )
Я не проверял, если выход верен, но с этими модификациями он, по крайней мере, работает. Поэтому, если есть больше проблем с кодом, это должно быть в используемой формуле.
Однако я бы посоветовал, что в следующий раз, когда вы захотите помощи с домашним заданием, вы, по крайней мере, скажете нам, где именно возникает проблема и что вы уже пробовали (сообщество охлаждается », вот какой -то код, пожалуйста, исправьте меня для меня». )