2013-09-05 2 views
-1

두 개의 매개 변수 x와 n을 갖는 new-sin이라는 함수를 작성했습니다. 함수에 의해 출력 된 값의 분모를 계산할 때 이것을 사용하기 때문에 함수 내에서 계승을 정의합니다. 이 함수는 x에서 계산 된 멱급수의 첫 번째 (n + 1) 항을 반환한다고 가정합니다. 구체적 (new-sin x 3)은 x - (x^3)/3을 반환해야합니다! + (x^5)/5! - (x^7)/7! ? n은 1) 또한 문 밖에 기록 될 예정이거나 그것이 바로 방법이스키마 New-Sin-X 함수

입니다 -

(새-죄가-X (X
(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) 

가되어 다음과 같이

내 코드입니다 .

+2

정말로 들여 쓰기와 괄호 일치를 돕는 무료 편집기에 투자해야합니다. 당신이 보았 더라면 +라는 용어가 하나 밖에 없었을 것입니다. – Sylwester

답변

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
0

, 당신을하는 데 도움이되는 좋은 IDE와 일치하는 코드 들여 쓰기.

(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 
+0

그건 내 자신이 아니야 : P 방금 고정 된 OP의 (un) 고정 괄호 –

+0

나타 내기 위해 수정 됨. – WorBlux

+0

n이 크고 x가 정확하지 않은 경우 핏불 수는 부동 소수점으로 표현할 수있는 값을 훨씬 초과하므로 오류가 발생합니다. 다행히도 n = 20은 매우 좋은 정확도를 제공합니다. – WorBlux