我将如何创建近似cos函数。
到目前为止我所拥有的。
(define k 0)
(define (approx-cos x n)
(cond
[(> 0 n) 0]
[else (* (/ (expt -1 k) (factorial (* 2 k))) (expt x (* 2 k)))]))
您的解决方案需要很多才能达到期望。对于初学者,您的参数已切换:第一个是您要计算的数字,第二个是迭代数...
这将我引到您解决方案中的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
会在某个时刻冻结执行。