2016-06-29 5 views
-2
def append(arr, n) 
    return arr if n < 0 
    puts "n1: #{n}, #{arr}" 
    append(arr, n-1) 
    puts "n2: #{n}, #{arr}" 
    arr << n 
    puts "n3: #{n}, #{arr}" 
    arr 
end 

append([],4) #=> [0, 1, 2, 3, 4] 

私はこの再帰的方法を理解できないようです。 0からnまでの配列を生成します。ルビの再帰的メソッド

arrとnがどのように動作しているかを確認するために、いくつか追加しました。

n1: 4, [] 
n1: 3, [] 
n1: 2, [] 
n1: 1, [] 
n1: 0, [] 
n2: 0, [] 
n3: 0, [0] 
n2: 1, [0] 
n3: 1, [0, 1] 
n2: 2, [0, 1] 
n3: 2, [0, 1, 2] 
n2: 3, [0, 1, 2] 
n3: 3, [0, 1, 2, 3] 
n2: 4, [0, 1, 2, 3] 
n3: 4, [0, 1, 2, 3, 4] 

nが-1までカウントダウンする方法を理解してから、arrが返されます。私が混乱しているのは、カウントアップが起こる場所です。 append(arr, -1)が呼び出されると、arrが返され、ループが停止し、私が得るのは[]です。なぜ、メソッドが返された後に実行し続けるのですか?カウントアップはどこで行われますか?

+0

'reverse_append'何ですか? – emlai

+0

申し訳ありませんが、タイプミス。それを私が直した。 – davidhu2000

答えて

1

returnは、すべての再帰呼び出しではなく、現在のメソッドから戻ります。つまり、最初にreturnの後に、制御フローはappendの次の行に進みます。次のようにn=2のためにバックトレースは次のようになります。

main ⇒ append      # n = 2 
main ⇒ append ⇒ append   # n = 1 
main ⇒ append ⇒ append ⇒ append # n = 0, return to: 
main ⇒ append ⇒ append   # here n = 1, continue execution till end 
main ⇒ append      # here n = 2, continue execution till end 
main        # the topmost recursion level returned to main