【发布时间】:2019-05-24 08:32:02
【问题描述】:
我正在完成 [SICP][1] 中的练习,我想知道是否有人可以解释这两个看似等效但给出不同结果的函数之间的区别!是因为四舍五入吗??我在想函数的顺序在这里应该无关紧要,但不知何故呢?有人可以解释这里发生了什么以及为什么不同吗?
详情:
练习 1.45:..看到找到
y => x/y的不动点并不 收敛,这可以通过平均阻尼来解决。相同 方法适用于找到立方根作为固定点 平均阻尼y => x/y^2。不幸的是,该过程不起作用 对于第四根——单个平均阻尼不足以产生 定点搜索y => x/y^3收敛。另一方面,如果我们 平均阻尼两次(即,使用平均阻尼的平均阻尼
y => x/y^3) 定点搜索确实收敛。做一些实验 确定计算第 n 个根需要多少平均阻尼 作为基于y => x/y^(n-1)的重复平均阻尼的定点搜索。使用它来实现计算根的简单过程 使用
fixed-point、average-damp和repeated过程 练习 1.43。假设您需要的任何算术运算都是 可作为原语使用。
我的回答(注意repeat和average-damping的顺序):
(define (nth-root-me x n num-repetitions) (fixed-point (repeat (average-damping (lambda (y) (/ x (expt y (- n 1))))) num-repetitions) 1.0))
我看到了另一种 Web 解决方案,其中直接在 average damp 上调用 repeat,然后使用参数调用该函数
(define (nth-root-web-solution x n num-repetitions) (fixed-point ((repeat average-damping num-repetition) (lambda (y) (/ x (expt y (- n 1))))) 1.0))
现在调用这两个,答案似乎有所不同,我不明白为什么!我的理解是函数的顺序不应该影响输出(它们是关联的吗?),但显然它是!
> (nth-root-me 10000 4 2)
>
> 10.050110705350287
>
> (nth-root-web-solution 10000 4 2)
>
> 10.0
我做了更多的测试,总是这样,我的答案很接近,但另一个答案几乎总是更接近!有人可以解释发生了什么吗?为什么这些不等价?我的猜测是调用这些函数的顺序搞砸了,但它们似乎与我有关联。
例如:
(repeat (average-damping (lambda (y) (/ x (expt y (- n 1)))))
num-repetitions)
对
((repeat average-damping num-repetition)
(lambda (y) (/ x (expt y (- n 1)))))
其他辅助函数:
(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(< (abs (- v1 v2))
tolerance))
(let ((next-guess (f first-guess)))
(if (close-enough? next-guess first-guess)
next-guess
(fixed-point f next-guess))))
(define (average-damping f)
(lambda (x) (average x (f x))))
(define (repeat f k)
(define (repeat-helper f k acc)
(if (<= k 1)
acc
;; compose the original function with the modified one
(repeat-helper f (- k 1) (compose f acc))))
(repeat-helper f k f))
(define (compose f g)
(lambda (x)
(f (g x))))
【问题讨论】:
标签: scheme lisp higher-order-functions sicp