2016-06-29 28 views
-1
def reverse_append(arr, n) 
    return arr if n < 0 
    reverse_append(arr, n-1) 
    arr << n 
    arr 
end 

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

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

誰かがこれを私に説明できますか?

+0

再帰関数が何をしているのかを把握する最も良い方法は、多くの場合、繰り返しごとに出力を追加することです。メソッドの最後の 'arr'行のすぐ上に' puts arr.inspect'を追加して実行してみてください。 –

+0

あなたはどこでそれがカウントアップすると思いますか? – sawa

+0

"私に説明してください"という質問に注意してください。ワイドオープン、「私にすべてのコードを説明する」質問は広すぎ、コードを理解するための研究/努力を示さない。研究を助けてくれなかったことを研究し説明した後、「特定の1つの線を説明する」は、広範ではなく、話題になる可能性が高い。それは小さなコードの塊なので、私は投票や投票に投票しませんでした。 –

答えて

7
  1. 方法reverse_append([],4)4 >= 0ので
  2. と呼ばれ、return文は呼び出されません。
  3. メソッドreverse_append([],3)が呼び出されます。
  4. 3 >= 0以降、returnというステートメントは呼び出されません。
  5. メソッドreverse_append([],2)が呼び出されます。
  6. 2 >= 0以降、returnというステートメントは呼び出されません。
  7. メソッドreverse_append([],1)が呼び出されます。
  8. 1 >= 0以降、returnというステートメントは呼び出されません。
  9. メソッドreverse_append([],0)が呼び出されます。
  10. 0 >= 0以降、returnというステートメントは呼び出されません。
  11. メソッドreverse_append([],-1)が呼び出されます。
  12. -1 < 0以降、配列([])が返されます。
  13. コールスタックの1つのレベルがn = 0arr = []にポップアップします。
  14. arr << narrが返されますので、arr = [0]です。
  15. コールスタックの1つのレベルをポップアップします。n = 1arr = [0]です。
  16. arr << nおよびarrが返されますので、arr = [0, 1]となります。
  17. コールスタックの1つのレベルがn = 2arr = [0, 1]にポップアップします。
  18. arr << narrが返されますので、arr = [0, 1, 2]です。
  19. コールスタックの1つのレベルがn = 3arr = [0, 1, 2]にポップアップします。
  20. arr << narrが返されますので、arr = [0, 1, 2, 3]です。
  21. コールスタックの1つのレベルが、n = 4arr = [0, 1, 2, 3]にポップアップします。
  22. arr << narrが返されますので、arr = [0, 1, 2, 3, 4]です。
  23. 最後に、「トップレベル」メソッドが返され、最終結果が返されます。
+0

本当に多くのステップがありますか? o.o – 13aal

+1

@ 13aal私は、再帰関数について初めて学ぶときに人々が持っている最大の概念上の難しさは、単純に例を1行ずつ調べ、実際に何が起こっているかを追跡することだと思います。そう、はい、私の答えはおそらくトップを少し超えています。基本的な考え方を理解するために、読者がこのようなコードを踏んでいくことを奨励することを願っています。 –

2

付属のパラメータでコードをステップ実行します。最初のステップはn <が0でないかどうかをチェックすることです。 0でない場合は、[]、3で逆順に追加し、その配列に数値を追加して配列を返します。

だから、配列を受け取り、それは[], 3[], 2[],1[], 0に対処するためのステップを経た後に、それに4を追加します。したがって、成功する最初の呼び出しは、配列が0より下になると配列を返すだけです。次に0が追加され、次に1から2、そして3、最後に4で元の呼び出しにarr << nが追加されます。

2

はあなたのコードが実行されると何が起こっているかを確認することができますあなたが「Seeing Is Believing」と呼ばれる多くのエディタに追加できる便利なツール、あります:

def reverse_append(arr, n) 
    return arr if n < 0 # => false, false, false, false, true 
    reverse_append(arr, n-1) # => [], [0], [0, 1], [0, 1, 2] 
    arr << n # => [0], [0, 1], [0, 1, 2], [0, 1, 2, 3] 
    arr # => [0], [0, 1], [0, 1, 2], [0, 1, 2, 3] 
end 

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

をしかし「reverse_append」のような名前では、それはそうですあなたが値に下降された結果表示されるはずのように:いずれの場合も

def reverse_append(arr, n) 
    return arr if n < 0 # => false, false, false, false, true 
    reverse_append(arr, n-1) # => [], [0], [1, 0], [2, 1, 0] 
    arr.unshift n # => [0], [1, 0], [2, 1, 0], [3, 2, 1, 0] 
    arr # => [0], [1, 0], [2, 1, 0], [3, 2, 1, 0] 
end 

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

を、再帰に頼ることなく、そのような配列を生成する簡単な方法がたくさんあります。

[*0..3] # => [0, 1, 2, 3] 
(0..3).to_a # => [0, 1, 2, 3] 

[*0..3].reverse # => [3, 2, 1, 0] 
(0..3).to_a.reverse # => [3, 2, 1, 0]