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