方案功能:计算距离2"向量"任何尺寸

时间:2014-04-08 04:00:56

标签: scheme

我的矢量定义为:

(x1, x2, …, xn) and (y1, y2, …yn)

我正试图像这样计算它们:

sqrt((x1-y1)*(x1-y1) + (x2-y2)*(x2-y2) + … + (xn-yn)*(xn-yn))

我遇到了超过2个元素的向量问题。我一直在尝试使用for-each循环,但我无法使递归正常工作。

另外,我可以得到除最终数字的sqrt之外的所有内容。我试图将最终数字定义为变量,然后取该变量的sqrt,但是我的解释器说了一些关于“在表达式中不允许定义......”。

到目前为止我的工作代码:

(define vectordistance 
  (lambda (v1 v2)
  (if 
   (null? v1) 0
      (+ 
      (*
      (- (car v1) (car v2))
      (- (car v1) (car v2))
      ) 
      (vectordistance (cdr v1) (cdr v2))
      )
  )
))

1 个答案:

答案 0 :(得分:2)

首先,您正在使用列表 - vector是Scheme中的另一种野兽。解决方案的关键点是你必须迭代在列表上,并以某种方式积累答案,直到没有剩余的元素。此外,辅助函数在这里很有用,因为首先我们必须累加加法并仅在结尾处取平方根。假设两个列表具有相同的长度:

; this is the same as yours, but better formatted
(define (helper v1 v2)
  (if (null? v1)
      0
      (+ (* (- (car v1) (car v2))
            (- (car v1) (car v2)))
         (helper (cdr v1) (cdr v2)))))

; call the above as a helper and take the square root of the result    
(define (vectordistance v1 v2)
  (sqrt (helper v1 v2)))

作为奖励(由Chris建议),您可以使用helper程序以更惯用的方式编写fold。检查您的口译员的文档,它可能被称为foldlfold-left或简称为fold,但这就是您使用它的方式 - 我们的想法是避免使用显式递归并支持使用更高阶的程序:

(define (square x)
  (* x x))

(define (helper v1 v2)
  (foldl (lambda (e1 e2 r)
           (+ (square (- e1 e2)) r))
         0
         v1 v2))