我试图找到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?
答案 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