ruby

时间:2016-06-29 18:38:00

标签: ruby recursion methods

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并且循环将停止,我得到的只是[]。那么为什么在调用返回后该方法继续运行?计数在哪里发生?

1 个答案:

答案 0 :(得分: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