Scheme 我将如何创建此函数
如何创建一个近似cos函数 到目前为止我所拥有的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)))])) 您的解决方案需要做大量工作才能达到预期效果。首先,您的参数被切换:第一个是您想要计算的数量,第二个是迭代的数量 这就引出了解决方案中的主要问题,您根本没有进行迭
(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,但你使用的语言似乎不支持它:好的,现在更新了。