Here是计算机程序的结构和解释'的问题和解决方案。练习1.15(see here)。我的问题是,我不知道这些公式的组合实际上是如何工作的:
和
表示小x
弧度值。
我理解这样的想法,即弧度角越接近零,它越接近该角度的正弦。我见过很好的解释(麻省理工学院开放式课程,可汗学院)。我也弄清楚了
公式得出。但他们如何一起使用来得出sin(x)
的答案? p
函数似乎只是将每个递归传递的可变角度除以3
,直到angle
低于0.1
然后在回来的路上,我们执行{{1}我们不得不除以p
的次数。所以似乎
神奇地变得与
相同通过递归申请。怎么样?我对递归理论并不十分精通。此外,如果这是以对数方式接近3
,那么就好像我们总计了许多小0.1
的整合。这似乎做了一些像Y-combinator一样模糊的东西 - 我也不太了解它。
另外,当我们看到递归步骤(递归)重复将x
除以$ 3 $时,最终会告诉你这是对数吗?我的意思是,看起来它在每个部门都取得了巨大的数量级跳跃,但还有另一种分析方法可以称之为对数减少吗?
答案 0 :(得分:2)
首先要指出的是,并不完全准确,因为x只是一个近似值。正确的符号是 。这看似有点挑剔,但很重要,因为这可以解释书中给出的正弦的练习和定义。
将和组合在一起的方法是在正弦过程的定义中。这个想法是,我们希望根据x的值返回近似值或第二个公式()。
如果x“足够小”,那么我们只返回x作为sin(x)的近似值。但是,如果它不是“足够小”,我们将使用。因为这是平等的,所以这显然很好。直到您注意到sin(x / 3)较小,因此可能可能“足够小”,这似乎没有必要。这就是为什么该过程是递归的,我们将继续这样做,直到sine的参数“足够小”为止。
您的困惑似乎在这里:
情况并非如此。这有点棘手,因为(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)<0.1近似于n,以使3.0 ^ n>近似于