Scheme 事先不了解方案';如何完成SICP练习1.45(生成第n个根函数)?

Scheme 事先不了解方案';如何完成SICP练习1.45(生成第n个根函数)?,scheme,lisp,rounding,sicp,Scheme,Lisp,Rounding,Sicp,在完成时,人们很快就会注意到,需要应用平均阻尼程序来查找一个数字的第n个根的次数非常接近n的以2为底的对数,四舍五入。换句话说,我们使用(floor(/(logn)(log2))。许多人都采取了这种确切的方法,只有我能找到的例外 然而,据我所知,直到本练习出现的章节之后,计算机程序的结构和解释才引入任何形式的舍入(例如floor)。这就提出了一个问题:我们知道读者打算如何完成这个练习吗?或者如果做不到这一点,是否有任何明显的方法(即,在事先不知道楼层的情况下进行取整(/(日志n)(日志2)))呢

在完成时,人们很快就会注意到,需要应用
平均阻尼
程序来查找一个数字的第n个根的次数非常接近n的以2为底的对数,四舍五入。换句话说,我们使用
(floor(/(logn)(log2))
。许多人都采取了这种确切的方法,只有我能找到的例外


然而,据我所知,直到本练习出现的章节之后,计算机程序的结构和解释才引入任何形式的舍入(例如
floor
)。这就提出了一个问题:我们知道读者打算如何完成这个练习吗?或者如果做不到这一点,是否有任何明显的方法(即,在事先不知道<代码>楼层<代码>的情况下进行取整<代码>(/(日志n)(日志2))<代码>)呢?

我认为您根本不需要知道方案程序<代码>楼层<代码>,因为练习说明明确指出您可以“假设您需要的任何算术运算都可以作为原语使用。”如果您需要
floor
,您可以假设它是可用的

但事实证明,无论如何,您都不需要
下限
。只要定义
重复
,使浮点计数有效地下限:


我想到了两次重复除法。@molbdnilo普通除法不能取整,所以这是错误的。我考虑过使用
余数
,但其错误是显而易见的。问题是:“假设您需要的任何算术运算都可以作为原语使用。”@adabsurdum True,但这模糊到了无用的程度。为什么?”复杂?,不复杂,完全符合你所描述的。通过重复平方计算幂,通过重复乘以2计算log_Base_2。这是一个天才的作品。我甚至忘了这本书已经给了我们一个x^n的过程(
expt
在上定义,它返回x^n,与数学常数e无关,正如我愚蠢地认为的那样)。
(define (repeated f n)
  (if (< n 2)
      f
      (lambda (x) (f ((repeated f (- n 1)) x)))))
(define (nth-root x n)
  (fixed-point ((repeated average-damp
                          (/ (log n) (log 2)))
                (lambda (y) (/ x (expt y (- n 1)))))
               1.0))