方案:找到离原点最近的三个点



我的"distFromOrigin"函数似乎运行良好,但我希望能够找到三个点中哪一个最小(即最接近原点)。你总是会得到一份三对的清单。我创建了一个函数"closestPoint"来尝试这样做,但我得到了以下错误:

*:预期违反合同:数量?给定:'(12)参数位置:第一个其他参数…:

(define t3 '( (1 2) (2 3) (3 4)))
(define distFromOrigin
  (lambda (lst)
    (sqrt (+
           (* (car lst)( car lst))
           (*(cadr lst)( cadr lst))))
    )
  )
(define closestPoint
 (lambda lst
   (< ((distFromOrigin (car lst)) ((distFromOrigin (cadr lst))) ((distFromOrigin (cadr (cdr lst)))))
      )
   )
  )

在Scheme中,括号应用过程,就像在C/Java中一样。x可能是一个变量或过程,但x()实际上是一个过程,它在那里被调用。这个狙击:

((distFromOrigin (car lst)) ((distFromOrigin (cadr lst)))
                            ((distFromOrigin (cadr (cdr lst)))))

第一个是运算符表达式,然后应用两个参数,这两个参数都是在求值后作为thunk运行的表达式。C++或Java版本看起来是这样的:

distFromOrigin(car(lst))( distFromOrigin(cadr(lst))(), 
                          distFromOrigin(cadr(cdr(lst)))() )

你看到了吗?因此,distFromOrigin显然需要返回一个接受零个或两个参数的过程。它与不同

(< (distFromOrigin (car lst)
   (distFromOrigin (cadr lst)) 
   (distFromOrigin (cadr (cdr lst)))))

这可能正是你想要的。还要知道kebab情况是Lisp语言中惯用的命名约定,所以您的代码应该是这样的:

(define dist-from-origin
  (lambda (lst)
    (sqrt (+ (* (car lst) (car lst))
             (* (cadr lst) (cadr lst))))))
(define closest-point
  (lambda lst
    (< (dist-from-origin (car lst)
       (dist-from-origin (cadr lst)) 
       (dist-from-origin (caddr lst))))

请注意,与您的代码相比,阅读它要容易得多。使用一个好的编辑器,确保你有正确的识别,并了解它应该是什么样子。你从来没有真正计算过结束括号——你只是看看缩进来理解它的结构。

最新更新