Last active
August 3, 2021 02:04
-
-
Save yanfeng42/0789252deac3166d4edfa1662c6c65a9 to your computer and use it in GitHub Desktop.
1.46 迭代式改进的一般 形式.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 迭代式改进. -- 哈哈哈. 最终的社区精简版, 竟然是我这种写法. --- 编程理念的差异. 在可读性和技巧性的取舍上, 我优先选择 可读性. | |
(define (iterative-improve good-enough? impove) | |
(define (f x) | |
(if (good-enough? x) | |
x | |
(f (impove x)) | |
) | |
) | |
f | |
) | |
; 社区改进版: 直接递归调用函数自己. | |
(define (iterative-improve good-enough? improve) | |
(lambda (guess) | |
(if (good-enough? guess) | |
guess | |
((iterative-improve good-enough? improve) (improve guess))))) | |
; old sqrt from 1.7 | |
(define (sqrt x) | |
(sqrt-iter 1.0 x) | |
) | |
(define (sqrt-iter guess x) | |
(if (good-enough? guess x) | |
guess | |
(sqrt-iter (impove guess x) x) | |
) | |
) | |
(define (impove guess x) | |
(average guess (/ x guess)) | |
) | |
(define (average x y) | |
(/ (+ x y) 2) | |
) | |
(define (good-enough? guess x) | |
(< (abs (- (square guess) x)) 0.01) | |
) | |
(define (square x) (* x x)) | |
; rewrite sqrt-iter. | |
(define (sqrt-iter guess x) | |
((iterative-improve (lambda (y) (good-enough? y x)) | |
(lambda (y) (impove y x))) | |
guess | |
) | |
) | |
; rewrite fixed-point. base 1.35.scm | |
(define (fixed-point f first-guess) | |
(define pre-guess first-guess) | |
((iterative-improve (lambda (guess) | |
(define old-pre-guess pre-guess) | |
(set! pre-guess guess) | |
(< (abs (- old-pre-guess guess)) tolerance)) | |
f) | |
(f first-guess) | |
) | |
) | |
(define (golden-ratio) | |
(fixed-point (lambda (x) (+ 1 (/ 1 x))) 1.0) | |
) | |
#| | |
> (golden-ratio) | |
1.6180327868852458 | |
|# | |
; 需要记录 前一个值... 社区有更好的方法吗? ==》 社区 “偷懒” 的方法. 但是这样计算结果的,会是 guess, 而不是 next. 和原实现的结果不同. | |
(define (fixed-point f first-guess) | |
((iterative-improve | |
(lambda (x) (close-enough? x (f x))) | |
f) | |
first-guess)) | |
#| | |
> (golden-ratio) | |
1.6180371352785146 | |
|# |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
社区答案, 表现一般.