我正在编写一个名为new-sin的函数,它有两个参数x和n。我在函数中定义了阶乘,因为我用它来计算函数输出值的分母。该函数应该返回在x处评估的幂级数的第一个(n + 1)项。具体来说(new-sin x 3)应该返回x - (x ^ 3)/ 3! +(x ^ 5)/ 5! - (x ^ 7)/ 7!
我的代码如下:
(define (new-sin-x x n)
(define (factorial j)
(if (= j 0) 1 (* j (factorial (- j 1)))))
(if (= n 0)
x
(+ (* (expt -1 n) (/ (expt x (+ 1 (* 2 n))) (factorial(+ 1 (* n 2.0))) (new-sin-x x (- n 1 )))))))
(new-sin-x 1 3)
是(new-sin-x x( - n 1)应该写在加法语句之外还是它是正确的?
答案 0 :(得分:1)
似乎有一些语法错误(错误的括号,确定)。这应该有效:
(define (new-sin-x x n)
(define (factorial j)
(if (= j 0)
1
(* j (factorial (- j 1)))))
(if (= n 0)
x
(+ (* (expt -1 n)
(/ (expt x (+ 1 (* 2 n)))
(factorial (+ 1 (* 2.0 n)))))
(new-sin-x x (- n 1)))))
这些错误很容易被发现,你只需要:
答案 1 :(得分:0)
这是基于奥斯卡原版的固定版本,并进行了优化。
(define (new-sin-x x n)
(let ((x (inexact->exact x)))
(define n-odd-fact ;;cheating here calculates the next odd factorial.
(let ((last-value 1)) ;;but real memiozation shouldn't be that hard
(lambda (j)
(begin (set! last-value (* j (- j 1) last-value))
last-value)))) ;;memioze(ish) last call
(let loop ((i 0) (sum x))
(let ((term (if (= i 0)
0
(* (if (odd? i) -1 1)
(/ (expt x (+ 1 (* 2 i)))
(n-odd-fact (+ 1 (* 2 i))))))))
(if (= i n)
sum
(loop (+ i 1) (+ sum term))))))) ;;tail call here