1

我想知道我写的是否正确;这是一个学校项目,所以我想在上传之前确保它给出正确的输出。

计算 cos x = 1 - ((x^2)/(2!)) + ((x^4)/(4!)) - ((x^6)/(6!)) + 的数学算法。 ..

所以这是我的代码:

(define (calc-cos x n)
  (define (hulp ctr res prevPow prevFac switch)
    (let ((switchOp (if (eq? (modulo switch 2) 0) + -)))
      (if (> ctr (+ 2 n))
          res
          (let ((newPow (* prevPow x x))
                (newFac (* (- ctr 1) ctr prevFac)))
            (hulp (+ ctr 2) (switchOp res (/ newPow newFac)) newPow newFac (+ switch 1))))))
  (hulp 2 1 1 1 1))
4

1 回答 1

1

让我们更精确地定义我们在这里尝试计算的内容。我们有无限和:

1 - ((x^2)/(2!)) + ((x^4)/(4!)) - ((x^6)/(6!)) + ...

意识到这里的“...”是“过程永远持续下去”的非正式表示法。这不是一个正式的符号:它要求读者思考模式是什么。让我们正式表达总和的条件。

令 T_n 为第 n 项:

T_n = (-1)^n * x^(2n)/(2n)!

您是否接受这是部分和的第 n 项的正式表示?

如果是这样,我们可以用我们的编程语言来表达:

(define (t_n x n)
  (/ (* (expt -1 n) 
        (expt x (* 2 n)))
     (fact (* 2 n))))

(define (fact n)
  (if (= n 0)
      1
      (* n (fact (sub1 n)))))

我不知道 t_n 计算的内容是否是您的函数计算的内容。我确实认为这里的 t_n 函数是数学函数的准确表示。

如果您接受 t_n 计算部分和的第 n 项,则:

(define (cos/approx x)
  (for/sum ([k (in-range 100)])
    (t_n x k)))

作为余弦的近似值,您应该可以接受。

一旦我们从一个正确的 cos/approx 定义开始,我们就可以开始努力提高效率,通过逐步重写来做一些事情,比如保留累积的阶乘等,最终达到你的定义。我相信有一条路可以做到,尽管它可能不适合这个文本区域的边缘。:)

于 2012-10-05T16:59:42.470 回答