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