【问题标题】:SICP: Why does this recursion-based sine approximation work?SICP:为什么这种基于递归的正弦逼近有效?
【发布时间】:2017-10-01 01:37:13
【问题描述】:

Here计算机程序的结构和解释'练习 1.15 (see here) 的问题和解决方案。我的问题是,我不知道这些公式的组合实际上是如何工作的:

对于较小的x 弧度值。

我理解这样的想法,即弧度角越接近零,它就越接近该角度的正弦。我看过很好的解释(MIT OCW,可汗学院)。我也弄明白了

公式是推导出来的。但是如何将它们一起用于得出sin(x) 的答案? p 函数似乎只是简单地将变量角度除以 3 每次递归传递,直到 angle 低于 0.1 然后在返回的路上,我们执行 p 的次数与我们必须划分的次数一样多通过3。好像是这样

神奇地变成了

通过递归应用程序。如何?我对递归理论不是很精通。此外,如果这在对数上越来越接近0.1,那么就好像我们汇总了很多小的x 的积分。这似乎在做一些类似于 Y-combinator 的事情——我还没有很好地掌握它。

另外,当我们看到递归步骤(递归)反复将angle 除以 $3$ 时,有什么能明确告诉您这是对数?我的意思是,看起来它在每个部门都取得了巨大的数量级飞跃,但是还有另一种分析方法可以称之为对数缩减吗?

【问题讨论】:

  • “数量级飞跃”= 对数。对数计算数量级的数量。
  • 它神奇地变成了sin(x)=3*sin(x/3)-4*sin(x/3)^3=3*x/3-4*(x/3)^3 =x-4/27x^3
  • 至于“它是如何工作的”——你已经展示了它是如何工作的。您证明了三角恒等式,并确认了小 x 的近似值。这只是递归:解决一个难题并转换为一个更简单的问题。重复,直到问题变得简单到可以解决为止。

标签: recursion trigonometry sicp


【解决方案1】:

首先要指出的是 并不完全准确,因为 x 只是一个近似值。正确的记法是 。这可能看起来有点挑剔,但它很重要,因为它解释了书中给出的练习和正弦的定义。

的组合方式在正弦过程的定义中。我们的想法是,我们希望根据 x 的值返回近似值或第二个公式 ()。

如果 x “足够小”,那么我们只返回 x 作为 sin(x) 的近似值。但如果它不是“足够小”,我们将使用。这显然很好,因为它是一个平等。在您注意到 sin(x/3) 更小,因此它可能“足够小”之前,这似乎是不必要的。这就是过程是递归的原因,我们将继续这样做,直到正弦参数“足够小”。

看来你的困惑的根源在这里:

所以 似乎神奇地变成了

事实并非如此。这有点棘手,因为(define (p x) (- (* 3 x) (* (4 (cube x)))) 不包含任何正弦,但请记住此定义中的 x 只是一个局部变量。但是,如果我们查看正弦过程定义的最后一行,我们可以看到我们实际上是在调用 (p (sin (/ angle 3.0))))),所以正弦在 p 调用的参数中。

递归在步数方面是对数的原因是我们将调用 p 过程的次数大约是我们必须将角度除以 3.0 以获得值的次数小于 0.1。如果角度很大,这是一个接近 1 的值。所以我们必须调用p,直到 angle/(3.0^n) angle 近似于

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-15
    • 1970-01-01
    相关资源
    最近更新 更多