putsと関数を呼ぶ位置を変えるだけでカウントアップ/ダウンになる理由

ただ単に再帰を使えばいいと勘違いしていたのでそれの補足。本当は、スタックを深く潜っていくときに引数を出力するか?スタックのそこから上がってくる時に引数を出力するか?によってカウントアップもカウントダウンも実装できるという意味だったみたい。関数を呼ぶ位置を変えるとカウントアップになったり、カウントダウンになったりする理由は、このような関数をつくると分かるかも。

def f n,start=n
  if n < 0 #実はこのif文により処理を終了しているのは1回だけ
    puts "#{" "*start}==arrived at deepest stack.=="
    return
  end

  puts "#{" "*(start-n)}before call f(#{n})"  #関数を呼ぶ前のputs
  f(n-1, start)
  puts "#{" "*(start-n)}after call f(#{n})"  #関数を呼んだ後のputs
end

f 3

結果

#=>
# before call f(3)
#  before call f(2)
#   before call f(1)
#    before call f(0)
#    ==arrived at deepest stack.==
#    after call f(0)
#   after call f(1)
#  after call f(2)
# after call f(3)