【问题标题】:Iterative sinus function in scheme方案中的迭代正弦函数
【发布时间】:2016-10-14 08:46:44
【问题描述】:

所以,我最近开始学习方案,通过 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 错误。 如果有人可以看一下,我将不胜感激。

【问题讨论】:

    标签: function math scheme racket


    【解决方案1】:

    如果你会迭代会更容易

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

    这避免了阶乘中的溢出问题,并且计算效率更高。


    但更直接的问题是您使用的阶乘是(2*ctr)!,而您需要(2*ctr-1)!

    您可以重新组织您的代码,使fac(2*ctr-1)!,而newfac 的结果为(2*ctr+1)!,即fac*(i+1)*(i+2)


    下一个问题:从res=1 开始,它应该是res=0, ctr=1res=x, ctr=2。在后一种情况下,初始化fac=1 和计算newfac = fac*(i-1)*i 以使newfac=(2*ctr-1)! 也没有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2019-07-23
      • 2014-05-07
      • 2021-07-14
      • 1970-01-01
      相关资源
      最近更新 更多