2016-10-14 3 views
0

최근에 나는 DrRacket을 통해 학습 체계를 시작했으며 부비동에 대한 반복 기능을 작성해야합니다. 이것은 내가 지금까지 무엇을 가지고 있습니다 :구성표의 반복 부비동 기능

(define (calc-sin x n) 
    (define (iter ctr res fac xpow sign) 
    (if (>= ctr n) 
     res 
     (let* ((i (- (* 2 ctr) 1)) 
       (newfac (* fac i (+ i 1))) 
       (newxpow (expt x i)) 
       (newsign (- sign))) 
     (iter (+ ctr 1) 
       (+ res (/ (* newsign newxpow) newfac)) 
       newfac 
       newxpow 
       newsign)))) 
    (iter 1 1 1 1 -1)) 

코드 실행,하지만 난 시도하고 값을 삽입 할 때마다, 내가 잘못 대답을 얻고, 최대한 빨리 내 대답을 편집하려고, 나는이 bad syntax 오류 . 누군가가 살펴볼 수 있다면 정말 고맙겠습니다.

답변

0

당신이 계승에 오버 플로우 문제를 방지하고 계산 더 효율적입니다

newterm = -term *x*x/(i*(i+1)) 
newres = res+newterm 

를 반복한다면 그것은 쉬울 것이다.


그러나 더 즉각적인 문제는 당신이 (2*ctr-1)!을 필요로하는 동안 사용되는 요인이 (2*ctr)! 것입니다. fac(2*ctr-1)!하고 newfac의 결과가, fac*(i+1)*(i+2), 즉 (2*ctr+1)! 수 있도록

당신은 당신의 코드를 재구성 할 수있다.


다음 문제는 : 그것은 res=0, ctr=1 또는 res=x, ctr=2해야 하나 어디 있는지 res=1로 시작합니다. 후자의 경우 fac=1을 초기화하고 newfac = fac*(i-1)*i을 계산하면 아무런 문제가 없으므로 newfac=(2*ctr-1)!이됩니다.