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