我遇到麻烦,我的代码感觉不完整而且完全错误。对于我的函数(terms-needed x tol)
我应该找到最小的k
,使x
和(square (babylonian x k))
之间的差异小于tol
(容差)。换句话说,我们应该测量k
在函数(babylonian x k)
中需要多大才能提供平方根的良好近似。
截至目前,我收到的错误是“申请:不是程序;”用我的代码
(define (square x)
(* x x))
(define (first-value-k-or-higher x tol k)
(if (<= (x)
(square (babylonian x k)) tol)
k)
(first-value-k-or-higher x tol (+ k 1))
)
(define (terms-needed x tol)
(first-value-k-or-higher x tol 1))
如果(first-value-k-or-higher x tol k)
在参数k
的(square (bablyonian x k))
内,我们应该使用辅助函数tol
,其评估为x
,否则用更大的k
递归调用自身。
这是使(terms-needed x tol)
工作所需的功能:
(define (babylonian x k)
(if (>= x 1)
(if (= k 0)
(/ x 2)
(* (/ 1 2) (+ (expt x (/ 1 2)) (/ x (expt x (/ 1 2))))))
1)
)
这是全文,提供了问题应该是什么的完整背景。
我们现在将测量
k
在上述函数中需要多大才能提供平方根的良好近似。你将编写一个SCHEME函数(terms-needed x tol)
,它将评估tol
中所需的无限和中的项数,即最小的k
,使得x
和(square (babylonian x k))
之间的差值小于tol
。备注2.乍一看,定义(terms-needed x tol)
的问题看起来有点挑战性,因为如何用较小的问题来表达它并不是很明显。但你可以考虑写一个辅助函数(first-value-k-or-higher x tol k)
,如果k
在(square (bablyonian x k))
参数的tol
内,则计算x
,否则用更大的k
递归调用自己。
你有几个问题。
首先,你在x
周围有括号
(if (<= (x)
这导致你看到的错误,因为它试图调用名为x
的函数,但x
命名一个数字,而不是函数。
其次,你没有计算x
和(square (babylonian x k))
之间的差异。相反,你给了<=
3个参数。
第三,当比较失败时,你没有进行递归调用。它在if
之外,所以它一直在进行(如果你使用编辑器的自动缩进功能,你可能已经注意到了这个问题)。
第四,你需要得到差异的绝对值,而不仅仅是差异本身。否则,如果差异是一个很大的负数,你会认为它在公差范围内,它不应该。
(define (first-value-k-or-higher x tol k)
(if (<= (abs (- x (square (babylonian x k))))
tol)
k
(first-value-k-or-higher x tol (+ k 1))))