【发布时间】:2015-01-12 12:57:20
【问题描述】:
(defun helper-2 (list)
(if (null (first (rest list)))
0)
(+ (distance ((car list) (first (rest list))))
(helper-2 (rest list))))
我是 lisp 的新手,我正在编写一个程序来计算任何多边形的周长,输入遵循顺时针顺序。我的逻辑是我使用辅助方法来计算两个相邻点的长度并求和。递归完成后,我将进行单独调用以计算从起点到终点的长度并将所有内容相加。我已经完成了距离方法,它需要 2 个点并返回长度。
(distance '(2 0) '(4 0)) ;this will output 2
helper-2 逻辑: 假设我们有 3 个点 a (2 0) b (3 3) c (4 0) 这种方法期望将 ab 和 bc 之间的距离相加。但是,我不断收到“(汽车头)应该是一个 lambda 表达式”错误。任何人都可以帮忙吗?谢谢你。或者谁能给我一个更好的方法来计算多边形的周长?
(defun square (n) (* n n))
(defun distance (a b)
(let ((h (- (second b) (second a)))
(w (- (first b) (first a))))
(sqrt (+ (square h) (square w)))))
【问题讨论】:
-
顺便说一句,为了便于阅读,您可能希望保持对
first/rest和car/cdr的使用保持一致。在这里混合car和first/rest有点令人困惑。还有(cadr list)与(first (rest list))的作用相同。 -
在 Scheme 中,
((car args1...) args2...)将首先评估(car args1...)以产生一些值 x,然后尝试使用 args2 将 x 作为函数调用。在 Common Lisp 中,函数调用必须采用(xxx ...)的形式,其中 xxx 是符号或 lambda 表达式(car ...)也不是。实现看到它不是一个符号,所以认为它应该是一个 lambda 表达式,但它不是,并抱怨。
标签: lambda lisp common-lisp