原です。

では、こういうのも:

def proc_rec(&block)
   f = proc{|*args| block[f][*args] }
end

p proc_rec{|f| proc{|n| n.zero? ? 1 : n * f[n - 1]}}[5] #=> 120