我将如何着手创建此功能

How would I go about create this function

如何创建近似 cos 函数。

到目前为止我有什么。

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





您的解决方案需要大量 工作才能达到预期。对于初学者,您的参数已切换:第一个是您要计算的数字,第二个是迭代次数...

这导致我在您的解决方案中遇到 主要 问题,您根本没有迭代!你应该在某个时候调用 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 将在某个时候冻结执行。