我想知道我写的是不是正确的;它是一个针对学校的项目,所以我希望在上传之前确保它能提供正确的输出。
用于计算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))
答案 0 :(得分: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的定义开始,我们就可以开始努力使其高效,通过逐步重写来完成诸如保留累积因子等的事情,最终达到你的定义。我相信有一条路可以这样做,虽然它可能不适合这个文本区域的边缘。 :)