编写一个找到最小k的函数,使得x和函数之间存在差异

问题描述 投票:0回答:1

我遇到麻烦,我的代码感觉不完整而且完全错误。对于我的函数(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递归调用自己。

scheme
1个回答
0
投票

你有几个问题。

首先,你在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))))
© www.soinside.com 2019 - 2024. All rights reserved.