Ваше решение требует много работы, прежде чем оно соответствует ожиданиям. Для начала, ваши параметры переключаются: первый - это число, которое вы хотите вычислить, а второй - количество итераций ...
, что приводит меня к проблеме major в ваше решение, вы не повторяете вообще! Вы должны вызвать approx-cos
в какой-то момент или какую-нибудь вспомогательную процедуру для выполнения цикла (как я).
И последнее, но не менее важное: вы не правильно реализуете формулу. Где, например, часть -1
? Или где вы умножаете на x^2k
? Я боюсь, что полная перезапись в порядке:
; main procedure
(define (approx-cos x n)
; call helper procedure
(loop 0 0 x n))
; define a helper procedure
(define (loop acc k x n)
; loop with k from 0 to n, accumulating result
(cond [(> k n) acc] ; return accumulator
[else
(loop (+ acc ; update accumulator
(* (/ (expt -1.0 k) ; implement the formula
(factorial (* 2.0 k)))
(expt x (* 2.0 k))))
(add1 k) ; increment iteration variable
x n)]))
Это пройдет все ожидаемые проверки:
(approx-cos 0 0)
=> 1
(approx-cos (/ pi 2) 0)
=> 1
(approx-cos 0 10)
=> 1
(approx-cos pi 10)
=> -0.9999999999243502
(approx-cos (* 3 (/ pi 2)) 9)
=> -1.1432910825361444e-05
(approx-cos 10 100)
=> -0.8390715290756897
Несколько заключительных мыслей: ваша реализация factorial
очень медленная , если вы планируете выполнять большее количество итераций, ваш factorial
в какой-то момент остановит выполнение.