Scheme 我将如何创建此函数

Scheme 我将如何创建此函数,scheme,racket,Scheme,Racket,如何创建一个近似cos函数 到目前为止我所拥有的 (define k 0) (define (approx-cos x n) (cond [(> 0 n) 0] [else (* (/ (expt -1 k) (factorial (* 2 k))) (expt x (* 2 k)))])) 您的解决方案需要做大量工作才能达到预期效果。首先,您的参数被切换:第一个是您想要计算的数量,第二个是迭代的数量 这就引出了解决方案中的主要问题,您根本没有进行迭

如何创建一个近似cos函数

到目前为止我所拥有的

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





您的解决方案需要做大量工作才能达到预期效果。首先,您的参数被切换:第一个是您想要计算的数量,第二个是迭代的数量

这就引出了解决方案中的主要问题,您根本没有进行迭代!你应该在某个时候调用近似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

最后想一想:您的阶乘实现非常缓慢,如果您计划进行更多的迭代,您的阶乘将在某个点冻结执行。

@loren an if与cond相同,但只针对一个条件。我正在使用的命名let,它与编写一个助手过程是一样的,您需要它。用你更熟悉的方式重写我的解决方案应该很容易。@loren不太熟悉。我用你更熟悉的方式重写了它。谢谢你,奥斯卡,有一个关于帮助函数循环的问题,它说n没有定义,我需要在这个函数中添加另一个变量n吗?它应该取外部的n,但你使用的语言似乎不支持它:好的,现在更新了。