sicp中的定点练习
#+BEGIN_SRC scheme
(define tolerance 0.00001)
(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) tolerance))
(define (try guess)
(let ((next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
(fixed-point cos 1.0)
#+END_SRC
#+RESULTS:
: 0.7390822985224024
参考行
(let ((next (f guess)))
我假设已添加了多余的括号,并将其更改为
(let (next (f guess))
再次运行但拒绝工作
#+BEGIN_SRC scheme
(define tolerance 0.00001)
(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(< (abs (- v1 v2)) tolerance))
(define (try guess)
(let (next (f guess))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))
(fixed-point cos 1.0)
#+END_SRC
#+RESULTS:
怎么了?
只是语法问题,您应该检查let
的文档。它需要一个list绑定和一个正文,其中每个出价都是一个包含两个元素,变量名和表达式的列表-因此,这是正确的方法(添加了额外的换行符以进行解释,但切勿缩进像这样):
let
您的尝试失败:
(let ( ; start list of bindings
( ; start binding
next ; binding name
(f guess) ; binding value
) ; end binding
) ; end list of bindings
<body>)
...因为它缺少在主体部分之前界定绑定列表的外部(let (next (f guess))
...)
。现在很明显,我们可以将多个绑定作为()
的一部分,这就是为什么绑定列表的外部let
是强制性的。]
方案