2017-11-10 155 views
0

我正在尝试使用Scheme编程点距离公式。除非我遇到错误,否则我非常接近。编程点距公式时的方案错误 - 尝试应用非过程

确切的错误是:

Traceback (most recent call last): 

File "In [54]", line 5, col 11, in 'application' 

File "In [54]", line 5, col 11 

RunTimeError: attempt to apply non-procedure '4' 

这是我的代码:

; code for the distance procedure 

(define (distance p1 p2) (sqrt (+ (* (- (car(p2)) (car(p1))) (- (car(p2)) (car(p1)))) (* (- (car(cdr(p2))) (car(cdr(p1)))) (- (car(cdr(p2))) (car(cdr(p1)))))))) 

(distance (4 5) (3 2)) 

作为参考,点距离计算公式为:

√((X2 - X1)^ 2 +(y2 - y1)^ 2)

+0

按照计划语法一致。一个函数的一般结构是'(function arg1 arg2 ...)',所以你可以使用'(car p1)'而不是'(car(p1))'等等。 – assefamaru

+0

'(4 5) '尝试将参数'5'传递给过程'4'。查看Scheme语法的基础知识。 – molbdnilo

回答

0

通常最好是正确地格式化Scheme代码,而不是把所有的g只需一行。

并且命名中间值很有用。如果您的公式包含x1,x2,y1y2,请使用这些名称创建Scheme变量。这使得更容易理解解决方案。

方案有嵌套carcdr函数的几个缩写。如果您需要cdrcar,则可以使用cadr

Scheme允许您在变量名称中使用数学符号。如果变量包含x2x1的差异,则可以将其命名为x2-x1。这增强了Scheme的波兰语标记的可读性。

(define (distance p1 p2) 
    (let ((x1 (car p1)) 
     (y1 (cadr p1)) 
     (x2 (car p2)) 
     (y2 (cadr p2))) 
    (let ((x2-x1 (- x2 x1)) 
      (y2-y1 (- y2 y1))) 
     (sqrt (+ (* x2-x1 x2-x1) 
       (* y2-y1 y2-y1)))))) 

如果要将列表文字传递给函数,必须引用它们以防止评估。

(distance '(4 5) '(3 2)) 

或者使用正确的评价:

(distance (list 4 5) (list 3 2)) 
相关问题