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

ಠ_ಠ*_*ಠ_ಠ 2 scheme functional-programming racket

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

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

dyo*_*yoo 5

考虑expt,传递一个分数幂作为它的第二个参数.

但是,让我们说我们不知道expt.我们还能算吗?

一种方法是使用牛顿方法.例如,假设我们想要计算n ^(1/4).当然,我们已经知道我们可以采取sqrt两次这样做,但让我们看看牛顿的方法如何适用于这个问题.

鉴于n,我们想要发现x功能的根源:

f(x) = x^4 - n
Run Code Online (Sandbox Code Playgroud)

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

f(x) = x^4 - 16
Run Code Online (Sandbox Code Playgroud)

我们已经知道如果我们插入x=2那里,我们会发现它2是这个功能的根源.但是说我们不知道.我们如何发现x使该函数为零的值?

牛顿的方法说,如果我们猜测x,调用它x_0,我们可以通过执行以下过程来改进猜测:

x_1 = x_0 - f(x_0) / f'(x_0)
Run Code Online (Sandbox Code Playgroud)

哪里f'(x)导数的符号f(x).对于上面的情况,衍生物f(x)4x^3.

我们还可以得到更好的猜测x_2,x_3通过重复计算,...:

x_2 = x_1 - f(x_1) / f'(x_1)
x_3 = x_2 - f(x_2) / f'(x_2)
...
Run Code Online (Sandbox Code Playgroud)

直到我们累了

我们现在在代码中写这个:

(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))))))
Run Code Online (Sandbox Code Playgroud)

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

> approx-quad-root-of-16
2.0457437305170534
Run Code Online (Sandbox Code Playgroud)

嘿,很酷.它实际上正在做一些事情,它接近于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))))))
Run Code Online (Sandbox Code Playgroud)

这样做有效吗?让我们来看看:

> (approx-quad-root-of-n 10)
1.7800226459895
> (expt (approx-quad-root-of-n 10) 4)
10.039269440807693
Run Code Online (Sandbox Code Playgroud)

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

这是如何解决这些问题的草图.有关详细信息,请参阅计算机程序结构和解释中计算平方根的部分.