2016-10-14 10 views
0

私は最近、DrRacketを通して学習スキームを開始しました。sinusの反復関数を記述する必要があります。スキームの反復洞の機能

(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の結果は(2*ctr+1)!、すなわち、fac*(i+1)*(i+2)であるようにあなたのコードを再編成することができます。


次の問題:あなたはそれがres=0, ctr=1またはres=x, ctr=2のいずれかである必要がありres=1で始まります。後者の場合は、fac=1の初期化とnewfac = fac*(i-1)*iの計算に問題がないので、newfac=(2*ctr-1)!となります。