如何在Scheme中使用原始表达式找到第6个根?

时间:2012-11-16 05:38:31

标签: functional-programming scheme racket

原始表达方式,我的意思是+ - * / sqrt,除非有其他我错过的。我想知道如何编写一个Scheme表达式,只使用这些函数找到第6个根。

我知道我可以找到平方根的立方根,但立方根似乎不是原始表达式。

2 个答案:

答案 0 :(得分:5)

考虑expt,传递分数幂作为其第二个参数。

但是我们说我们不知道expt。我们还能计算吗?

实现此目的的一种方法是应用Newton's method之类的内容。例如,假设我们想要计算n ^(1/4)。当然,我们已经知道我们可以两次sqrt来做这个,但让我们看看牛顿方法如何应用于这个问题。

鉴于n,我们想要发现函数的根x

f(x) = x^4 - n

具体来说,如果我们想查找16^(1/4),那么我们会寻找函数的根目录:

f(x) = x^4 - 16

我们已经知道如果我们在那里插入x=2,我们会发现2是此函数的根。但是说我们不知道。我们如何发现使此函数为零的x值?

Newton的方法说,如果我们猜测x,将其称为x_0,我们可以通过以下过程改进猜测:

x_1 = x_0 - f(x_0) / f'(x_0)

其中f'(x)f(x) f(x)的表示法。对于上述情况,4x^3的导数为x_2

我们可以通过重复计算得到更好的猜测x_3x_2 = x_1 - f(x_1) / f'(x_1) x_3 = x_2 - f(x_2) / f'(x_2) ... ,...:

(define (f x)
  (- (* x x x x) 16))

(define (f-prime x)
  (* 4 x x x))

(define (improve guess)
  (- guess (/ (f guess)
              (f-prime guess))))

(define approx-quad-root-of-16
  (improve (improve (improve (improve (improve 1.0))))))
直到我们累了。

现在让我们在代码中写下这一切:

f(x)

上面的代码只是表达f'(x)approx-quad-root-of-16,以及改进初始猜测五次的想法。让我们看看> approx-quad-root-of-16 2.0457437305170534 的价值是什么:

2
嘿,很酷。它实际上正在做某事,它接近于1.0。从16这么糟糕的第一次猜测开始就不错了。

当然,在那里硬编码n有点傻。让我们概括一下,把它变成一个取代任意(define (approx-quad-root-of-n n) (define (f x) (- (* x x x x) n)) (define (f-prime x) (* 4 x x x)) (define (improve guess) (- guess (/ (f guess) (f-prime guess)))) (improve (improve (improve (improve (improve 1.0)))))) 的函数,这样我们就可以计算任何东西的四元根:

> (approx-quad-root-of-n 10)
1.7800226459895
> (expt (approx-quad-root-of-n 10) 4)
10.039269440807693

这有效吗?我们来看看:

improve

酷:它正在做一些有用的事情。但请注意,它还不是那么精确。为了获得更好的精确度,我们应该继续调用{{1}},而不是仅仅调用四到五次。思考循环或递归:重复改进,直到解决方案“足够接近”。

这是如何解决这些问题的草图。有关详细信息,请查看derivative

答案 1 :(得分:2)

你可能想尝试一种数字方式,对于较大的数字可能效率不高,但它可以工作。

此外,如果您还将pow计为基元(因为您还算sqrt),您可以这样做:

pow(yournum, 1/6);