Scheme New-Sin-X函数

时间:2013-09-05 21:57:58

标签: scheme sum sine

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

2 个答案:

答案 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. 正确缩进代码
  2. 正确匹配括号
  3. 使用一个好的IDE来帮助你1和2

答案 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