再帰呼び出し

7月 4th, 2008 admin Posted in アルゴリズムとデータ構造 | 2 Comments »

今日も「アルゴリズムとデータ構造シリーズ」です。本日は「再帰呼び出し」について。

再帰呼び出しとは

関数が自分自身を呼び出すのが「再帰呼び出し」。再帰が何かといわれれば、それはエッシャーの「描く手」であり落語の「頭山」でありGNUの名前の由来であったり、そしてなんといっても亜空の瘴気ヴァニラ・アイス様と答えるのが妥当でしょうか

今回は再帰呼び出しを使って2つ以上の数の最大公約数を求めるスクリプトを書きました。a,b,cと3つの数字があったら、b,cの最大公約数をもとめて、aと(b,cの最大公約数)の最大公約数を求めるというアルゴリズムです。

コード

RUBY:
  1. #recursive
  2.  
  3. class Gcd
  4.   def initialize
  5.     @list = Array.new
  6.   end
  7.  
  8.   def execute
  9.     multi_gcd(@list.size - 1)
  10.   end
  11.  
  12.   def set(i)
  13.     @list.push(i)
  14.   end
  15.  
  16.   #二つの数の最大公約数を求める
  17.   def gcd( a, b)
  18.     a.downto(1) do |num|
  19.       return num if(a%num == 0 && b%num==0)
  20.     end
  21.     nil
  22.   end
  23.  
  24.   def multi_gcd(n)
  25.     #数が2以下ならgcdを呼ぶだけ
  26.     return self.gcd(@list[0],@list[1]) if n == 1
  27.  
  28.     #数が3以上ならmulti_gcdよ呼びなおす
  29.     return self.gcd(@list[n], self.multi_gcd(n-1))
  30.   end
  31. end
  32.  
  33. mg = Gcd.new
  34. mg.set(9)
  35. mg.set(6)
  36. mg.set(27)
  37. p mg.execute

まとめ

再帰をイメージするときいつも、子どもの頃に遊んだ、見た目はアイスの棒みたいな10cm幅ぐらいのロール紙の玩具を思い出します。振ると伸びて戻ってくるあれです。

※このシリーズは私がRubyでアルゴリズムとデータ構造を基礎から学ぶ記録です。全体の目次はこちらへ。

2 Responses to “再帰呼び出し”

  1. [...] 再帰呼び出し [...]

  2. good morning, I sent an message to you about this post, its not coming thru for me. Can you connect with me when you get a chance.