Trans wrote: > You can make the block a normal parameter using the & operator. > > def arecursor(param, &block) > [...] > block.call(var) > [...] > if (some condition) > arecursor(another_var,&block) > end > [...] > end > > T. > You can also do it with yield, but it doesn't improve performance. (Using yield instead of & is faster in some cases, because no Proc object is created.) def recurse_n_times_using_yield(n) return if n == 0 yield n recurse_n_times_using_yield(n-1) do |nn| yield nn end end recurse_n_times_using_yield(10) {|n| p n} def recurse_n_times_using_proc(n, &block) return if n == 0 yield n recurse_n_times_using_yield(n-1, &block) end recurse_n_times_using_proc(10) {|n| p n} require 'benchmark' Benchmark.bmbm do |bm| bm.report 'using_yield' do recurse_n_times_using_yield(1000) {|n|} end bm.report 'using_proc' do recurse_n_times_using_proc(1000) {|n|} end end __END__ Rehearsal ----------------------------------------------- using_yield 1.760000 0.010000 1.770000 ( 1.775127) using_proc 0.610000 0.000000 0.610000 ( 0.612273) -------------------------------------- total: 2.380000sec user system total real using_yield 0.620000 0.000000 0.620000 ( 0.621149) using_proc 0.620000 0.000000 0.620000 ( 0.618183) -- vjoel : Joel VanderWerf : path berkeley edu : 510 665 3407