Thursday, January 29, 2009

平方根の近似解法

計算機プログラムの構造と解釈の例をRubyで

   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: