方案:找到离原点最近的三个点

Scheme: finding closest of three points to the origin

我的 "distFromOrigin" 函数似乎工作正常,但我希望能够找到三个点中的最小点(即最接近原点)。您将始终获得三对的列表。我创建了一个函数 "closestPoint" 来尝试这样做,但出现以下错误:

*: contract violation expected: number? given: '(1 2) argument position: 1st other arguments...:

(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)))))
      )
   )
  )

在 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 显然需要 return 一个接受零个或两个参数的过程。它与 :

不同
(< (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))))

请注意,与您的代码相比,它更容易阅读。使用一个好的编辑器来确保你有正确的标识并了解它应该是什么样子。你永远不会真正计算结束括号你只是看缩进来理解结构。