我正在做 [SICP][1] 中的练习,想知道是否有人可以解释这两个看似等效但结果不同的函数之间的区别!这是因为四舍五入??我认为函数的顺序在这里不重要,但不知何故呢?有人可以解释这里发生了什么以及为什么不同吗?
细节:
练习 1.45 : ..看到找到 的不动点
y => x/y不收敛,这可以通过平均阻尼来解决。相同的方法适用于寻找立方根作为 average-damped 的不动点y => x/y^2。不幸的是,该过程不适用于四次根——单个平均阻尼不足以进行定点搜索y => x/y^3以求收敛。另一方面,如果我们两次平均阻尼(即,使用 的平均阻尼的平均阻尼
y => x/y^3),定点搜索确实收敛。做一些实验来确定需要多少平均阻尼来计算 nth 根作为基于重复平均阻尼的定点搜索y => x/y^(n-1)。使用此实现计算使用根一个简单的过程
fixed-point,average-damp和repeated锻炼的过程1.43。假设您需要的任何算术运算都可用作原语。
我的回答(注意repeat和的顺序average-damping):
Run Code Online (Sandbox Code Playgroud)(define (nth-root-me x n num-repetitions) (fixed-point (repeat (average-damping (lambda (y) (/ x (expt y (- n 1))))) num-repetitions) 1.0))
我看到了一个替代的网络解决方案,repeat它直接调用average damp,然后使用参数调用该函数
Run Code Online (Sandbox Code Playgroud)(define (nth-root-web-solution x n num-repetitions) (fixed-point …
我是新来的Lisp和贯通进入ANSI Common Lisp的由保罗·格雷厄姆和演习之一是这样定义适用,如果任何号码打印出来它会返回默认情况下,八进制打印之前的功能.
我尝试了以下方法:
(let ((*print-base* 8))
(defun like-apply (&rest args)
(apply #'apply args)))
Run Code Online (Sandbox Code Playgroud)
但它没有按预期工作:
(like-apply #'princ '(8)); returns 8 8 (expecting 10 8)
Run Code Online (Sandbox Code Playgroud)
然而,以下工作:
(defun apply8 (&rest args)
(let ((*print-base* 8))
(apply #'apply args)))
Run Code Online (Sandbox Code Playgroud)
正确返回:
(apply8 #'princ '(8)); returns 10 8 (as expected)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是为什么第二个例子有效,但不是第一个?两者似乎都操纵*print-base*变量.