方案操作递归执行而不是只执行一次
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))
我试图找出 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))