1 #!/usr/local/bin/ruby
2 # encoding: utf-8
3 def sqrt_iter(guess, x)
4 if x.good_enough?(guess)
5 guess
6 else
7 sqrt_iter(x.improve(guess), x)
8 end
9 end
10
11 class Integer
12 def sqrt
13 sqrt_iter(1.0, self)
14 end
15
16 def improve(guess)
17 average(guess, self/guess)
18 end
19
20 def good_enough?(guess)
21 (guess**2 - self).abs < 0.001
22 end
23
24 private
25 def average(x, y)
26 (x + y) / 2
27 end
28 end
29
30 9.sqrt # => 3.00009155413138
31 (100 + 37).sqrt # => 11.7046999177581
No comments:
Post a Comment