我将如何创建此函数

问题描述 投票:0回答:1

我将如何创建近似cos函数。

到目前为止我所拥有的。

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





scheme racket
1个回答
1
投票

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

这将我引到您解决方案中的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会在某个时刻冻结执行。

© www.soinside.com 2019 - 2024. All rights reserved.