Recursion SICP:为什么这种基于递归的正弦近似有效?

Recursion SICP:为什么这种基于递归的正弦近似有效?,recursion,trigonometry,sicp,Recursion,Trigonometry,Sicp,是计算机程序的结构和解释的问题和解决方案练习1.15()。我的问题是,我不知道这些公式的组合实际上是如何工作的: 及 对于较小的x弧度值 我理解弧度角越接近零,它就越接近该角度的正弦。我看到了很好的解释(麻省理工学院开放式课程,可汗学院)。我还计算出了 推导了计算公式。但是,如何将它们结合起来来推导出sin(x)的答案呢?p函数似乎只是将变量角度除以3每次递归过程,直到angle低于0.1,然后在返回的过程中,我们执行p的次数与必须除以3的次数相同。看来 神奇地变得和你一样 通过递归应

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

对于较小的
x
弧度值

我理解弧度角越接近零,它就越接近该角度的正弦。我看到了很好的解释(麻省理工学院开放式课程,可汗学院)。我还计算出了

推导了计算公式。但是,如何将它们结合起来来推导出sin(x)的答案呢?
p
函数似乎只是将变量角度除以
3
每次递归过程,直到
angle
低于
0.1
,然后在返回的过程中,我们执行
p
的次数与必须除以
3
的次数相同。看来

神奇地变得和你一样

通过递归应用。怎么用?我对递归理论不是很精通。此外,如果这是对数接近
0.1
,这并不是说我们把很多小的
x
的积分加起来。这似乎是在做一些模糊的事情,比如Y-combinator——我也没有很好地理解它


另外,当我们看到递归步骤(递归)反复将
角度
除以$3$时,是什么告诉你这是对数的?我的意思是,它看起来在每一个除法上都有巨大的数量级跃迁,但是有没有另一种分析方法来称之为对数缩减呢?

首先要指出的是,这并不准确,因为x只是一个近似值。正确的符号是 . 这似乎有点吹毛求疵,但它很重要,因为这解释了书中给出的正弦的练习和定义

正弦程序的定义中规定了和的组合方式。我们希望根据x的值返回近似值或第二个公式()

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

你困惑的根源似乎在这里:

因此,它似乎神奇地变成了相同的

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


递归在步数方面是对数的原因是我们调用
p
过程的次数大约是我们必须将角度除以3.0才能得到小于0.1的值的次数。如果角度是一个大数字,则该值接近1。所以我们必须调用
p
,直到角度/(3.0^n)<0.1,它近似于n,这样3.0^n>角度,它近似于“数量级跃迁”=对数。对数计算数量级。它神奇地变成了
sin(x)=3*sin(x/3)-4*sin(x/3)^3=3*x/3-4*(x/3)^3=x-4/27x^3
至于“它是如何工作的”——你已经展示了它是如何工作的。您证明了三角恒等式,并确认了小
x
的近似值。这只是递归:把一个困难的问题转化为一个更简单的问题。重复上述步骤,直到问题变得如此简单,你就能解决它。