Scheme 方案功能:计算2”的距离;向量;任何尺寸的

Scheme 方案功能:计算2”的距离;向量;任何尺寸的,scheme,Scheme,我的向量定义为: (x1, x2, …, xn) and (y1, y2, …yn) 我试着这样计算它们: sqrt((x1-y1)*(x1-y1) + (x2-y2)*(x2-y2) + … + (xn-yn)*(xn-yn)) 我遇到了两个以上元素的向量的问题。我一直在尝试使用for-each循环,但我无法使递归正常工作 此外,我可以得到除最终数字的sqrt以外的所有数据。我试图将最终的数字定义为一个变量,然后取该变量的sqrt,但我的解释器说了一些关于“表达式中不允许定义…”的话 我目

我的向量定义为:

(x1, x2, …, xn) and (y1, y2, …yn)
我试着这样计算它们:

sqrt((x1-y1)*(x1-y1) + (x2-y2)*(x2-y2) + … + (xn-yn)*(xn-yn))
我遇到了两个以上元素的向量的问题。我一直在尝试使用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))
      )
  )
))
首先,您使用的是列表-
vector
在Scheme中是一个不同的beast。解决方案的关键点是,您必须迭代列表,并以某种方式累积答案,直到没有更多的元素。此外,辅助函数在这里也很有用,因为首先我们必须累加加法,只在最后取平方根。假设两个列表的长度相同:

; 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建议),您可以使用
fold
过程以更惯用的方式编写
helper
。检查解释器的文档,它可能被称为
foldl
fold left
或简单的
fold
,但这是您使用它的方式-其目的是避免使用显式递归,并倾向于使用高阶过程:

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

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

谢谢你,奥斯卡。你一直在救我的命。谢谢。我不知道这个计划有向量。我以为清单是唯一的集装箱计划。我认为我的原始代码工作了2个以上的元素(减去sqrt),我只是假设这并没有导致递归的东西让我的大脑扭曲哈哈。我非常渴望把它变成一个
折叠
,你不知道<代码>(折叠(λ(e1 e2 r)(+(正方形(-e1 e2))r))v1 v2)
或类似的东西(未测试)。;-)但我知道你试图尽可能多地保留OP的代码…@ChrisJester Young你明白了;)