(让(下一个(猜测))与(让(下一个猜测))

问题描述 投票:0回答:2

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:

怎么了?

syntax scheme lisp sicp
2个回答
2
投票

只是语法问题,您应该检查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是强制性的。]


1
投票

方案

© www.soinside.com 2019 - 2024. All rights reserved.