組み合わせの列挙~再帰~

再帰処理を利用して組み合わせ(3桁の3進数の取りうる値)の列挙をします。

$SIZE = 3 
$pos = [] 

def print_pos
     print "#{$pos}\n"
end

def set(i)
    (0..$SIZE).each { |x|
       $pos[i] = x
       if i == $SIZE -1 then
            print_pos()
       else
            set(i+1)
       end
    }
end

set(0)

実行結果です

[0, 0, 0]
[0, 0, 1]
[0, 0, 2]
~中略~
[3, 3, 2]
[3, 3, 3]

繰り返し文で実現することもできますが、再帰で実装しました。
私は、再帰処理はなんとなく頭で理解していても
細かい動きまでイメージできない場合があります。
なので機会があったので実装しました。
再帰は重いから嫌われますが、コードとして美しいなと改めて感じました。