-1

我正在编写一个名为 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 ) 是应该写在加法语句之外还是正确的方式?

4

2 回答 2

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. 正确缩进你的代码
  2. 正确匹配括号
  3. 使用可以帮助您完成 1 和 2 的良好 IDE
于 2013-09-05T22:14:38.840 回答
0

This is based on Oscar's fixed version of the original, with optimizations.

(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
于 2013-09-06T01:04:49.783 回答