Skip to content

Instantly share code, notes, and snippets.

@yanfeng42
Last active August 3, 2021 02:04
Show Gist options
  • Save yanfeng42/0789252deac3166d4edfa1662c6c65a9 to your computer and use it in GitHub Desktop.
Save yanfeng42/0789252deac3166d4edfa1662c6c65a9 to your computer and use it in GitHub Desktop.
1.46 迭代式改进的一般 形式.
; 迭代式改进. -- 哈哈哈. 最终的社区精简版, 竟然是我这种写法. --- 编程理念的差异. 在可读性和技巧性的取舍上, 我优先选择 可读性.
(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
|#
@yanfeng42
Copy link
Author

社区答案, 表现一般.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment