Как бы я go о создании этой функции - PullRequest
0 голосов
/ 10 марта 2020

Как бы я создал приблизительную функцию cos.

Что у меня есть до сих пор.

 (define k 0) 
(define (approx-cos x n) 
  (cond
    [(> 0 n) 0]
    [else (*  (/ (expt -1 k) (factorial (* 2 k))) (expt x (* 2 k)))]))





1 Ответ

1 голос
/ 10 марта 2020

Ваше решение требует много работы, прежде чем оно соответствует ожиданиям. Для начала, ваши параметры переключаются: первый - это число, которое вы хотите вычислить, а второй - количество итераций ...

, что приводит меня к проблеме 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 в какой-то момент остановит выполнение.

...