def rec &b
  f  = ->n{ b[ n , &f ] }
end
a = rec do | n , &f |
  if n == 0
    1
  else
    n * f.call(n-1)
  end
end
p a.call 7 # => 5040


やはりブロック外の変数は無理に参照しないのが好ましい