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

时间:2016-04-06 16:06:01

标签: scheme racket

我的" distFromOrigin"函数似乎工作正常,但我希望能够找到三个点中哪一个是最小的(即最接近原点)。您将始终获得三对列表。我创建了一个函数," nearestPoint"尝试这样做,但我得到以下错误:

  

*:合同违规预期:数量?给出:'(1 2)参数位置:第一个其他参数......:

(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)))))
      )
   )
  )

1 个答案:

答案 0 :(得分:2)

在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-case是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))))

请注意,与您的代码相比,阅读更容易。使用一个好的编辑器,确保你有正确的身份,并了解它应该是什么样子。你永远不会真正计算结束括号,你只需要看缩进来理解结构。

相关问题