Home / 別館 Home / Ruby / アルゴリズム / 再帰
| 掲示板 | Mail |

再帰呼び出し

再帰

基本的な考え方

 ある関数の内部で自分自身を呼び出して処理を繰り返す。

 確実に「繰り返しの終わり」がくるようにしなければならない。


数値の中に1がいくつ含まれるかを数えるプログラム(whileを使って) (List5-1)
class NumOfOne
  def main
    puts "適当な数値を入力して下さい"
    i = gets.chomp.to_i
    puts "#{i}の中に 1 は #{p_numOfOne( i )} 個含まれています。"
  end
  
  private
  def p_numOfOne( value )
    ret = 0
    # value を10で割って桁をずらしながら、最下位の桁が1であるかどうかを調べる
    while value > 0
      if value % 10 == 1
        ret += 1
      end
      value = value / 10
    end
    return ret
  end
end

countOne = NumOfOne.new
countOne.main

数値の中に1がいくつ含まれるかを数えるプログラム(再帰を使って) (List5-2)
class NumOfOne
  def main
    puts "適当な数値を入力して下さい"
    i = gets.chomp.to_i
    puts "#{i}の中に 1 は #{p_numOfOne( i )} 個含まれています。"
  end
  
  private
  def p_numOfOne( value )
    ret = 0
    if value == 0
      # value が0桁(これ以上解析する桁がない)
      return 0
    end
    
    if (value % 10) == 1
      # 一番下の位が1
      ret = 1
    else
      ret = 0
    end
    return ret + p_numOfOne( value / 10 )
  end

=begin
  # 三項演算子「?」を使った場合
  def p_numOfOne( value )
    if (value == 0)
      return 0
    end
    return (((value % 10) == 1) ? 1 : 0) + p_numOfOne(value / 10)
  end
=end

end

countOne = NumOfOne.new
countOne.main

応用例:2つの整数の最大公約数を求める (List5-3)
def gcd( a, b )
  i = a
  while i > 0
    break if (a % i == 0 && b % i == 0)
    i -= 1
  end
  return i
end

応用例:3つ以上の整数の最大公約数を求める (List5-4)
def gcd( a, b )
  i = a
  while i > 0
    break if (a % i == 0 && b % i == 0)
    i -= 1
  end
  return i
end

def multi_gcd( n, use )
  # use == 2 数が2つしかない場合は、普通に gcd を呼び出す
  if use == 2
    return gcd(n[0], n[1])
  end
  
  # use > 2 の場合は、n[n] と n[0]..n[n-1]の gcd を呼び出す
  return gcd(n[n.length - 1], multi_gcd(n, use - 1))
end

array = [98, 140, 84, 28, 42, 126]
puts "配列 N の最大公約数は #{multi_gcd(array, array.length)} です"

【参考書籍】
 紀平拓男、春日伸弥 『プログラミングの宝箱 アルゴリズムとデータ構造』(ソフトバンク パブリッシング 2003)
 参考URL:http://www.cmagazine.jp/books/takarabako/

Home / 別館 Home / Ruby / アルゴリズム / 再帰
| 掲示板 | Mail |

とみくら まさや(vzx01036@nifty.ne.jp) $ Date: 2004/02/04 $