方案操作递归执行而不是只执行一次

Scheme operation performed recursively instead of only once

我试图找出 3D 中两点之间的距离 space:

这是我的代码:

(define (helper p1 p2)
    (if (null? p1)
        0
        (+ (distTo3D (cdr p1) (cdr p2))
           (expt (- (car p1) (car p2)) 2))))

(define (distTo3D p1 p2)
    (sqrt (helper p1 p2)))

我认为定义一个辅助函数可能会使 sqrt 仅在辅助函数末尾返回的元素上被调用。但是给出这样的调用:

(distTo3D '(1 1 1) '(2 2 2))

它返回了错误的答案。试验了一段时间后,我发现它正在返回 sqrt(sqrt(1) + sqrt(2)),就好像 sqrt 是递归语句本身的一部分一样。

如何更改我的代码,使其仅对 helper 返回的最后一个元素调用 sqrt?

helper应该是调用自己,而不是原来的函数:

(define (helper p1 p2)
    (if (null? p1)
        0
        (+ (helper (cdr p1) (cdr p2))
           (expt (- (car p1) (car p2)) 2))))

每次返回原始函数(sqrt 所在的位置)时,都会添加另一个不合适的 sqrt。如果您查看距离的定义,它是:

sqrt( sum( (x_i - y_i)^2 from 0 to n ) )

distTo3D 正在执行 sqrt 部分,整个求和循环由您的递归 helper.

处理

你不需要递归。

(define (helper p1 p2)
    (expt (- p1 p2) 2))

(define (distTo3D p1 p2)
    (inexact (sqrt (apply + (map helper p1 p2)))))

(distTo3D '(1 1 1) '(2 2 2))

可运行示例:http://eval.ironscheme.net/?id=145