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