SICP 练习 1.8 - 为什么我的函数没有终止?

Avr*_*oel 1 scheme sicp racket

我正在尝试实现立方根的牛顿法,但我的函数似乎挂起。我的代码与书中显示的平方根代码几乎相同,并根据improve需要修改了函数。

这是我的代码...

(define (cube-root x)
  (cube-root-iter 1.0 x))

(define (cube-root-iter guess x)
  (if (good-enough? guess x)
      guess
      (cube-root-iter (improve x guess) x)
      )
  )

(define (good-enough? guess x)
  (< (abs (- (* guess guess) x)) 0.001))

(define (improve x guess)
  (/ (+ (/ x (* guess guess)) (* 2 guess)) 3)
  )
Run Code Online (Sandbox Code Playgroud)

我进行了独立测试improvegood-enough?他们似乎给出了正确的答案。有人知道为什么我的代码不终止吗?

我在 Racket 中对sicp包进行此操作,以防产生任何影响。

ali*_*oar 5

您想要计算立方根。根据定义,的立方根x表示 的值。您尝试使用 进行近似,但您仅进行计算。需要乘以3倍:yy*y*y = xyguessy^2

(define (good-enough? guess x)
  (< (abs (- (* guess guess guess) x))
     0.001))
Run Code Online (Sandbox Code Playgroud)

如果你只乘以 2 次,y^2永远不会足够接近y^3,而它会更接近x。如果您尝试使用代码计算立方根,10可能会起作用(并且仅对于这些输入它可能起作用)。