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

时间:2015-04-19 18:26:12

标签: functional-programming scheme

我试图找到3D空间中两点之间的距离:

这是我的代码:

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

2 个答案:

答案 0 :(得分:4)

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处理。

答案 1 :(得分:1)

你不需要递归。

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

Runnable示例:http://eval.ironscheme.net/?id=145