我正在关注递归的视频,它在Ruby中
首先,将序列附加到数组的代码很容易理解:
def append(ary, n)
return ary if n < 0
ary << n
append(ary, n-1)
end
append([], 5)
=> [5, 4, 3, 2, 1, 0]
我不明白的事情是何时出现reverse_append函数:
01 def reverse_append(ary, n)
02 return ary if n < 0
03 reverse_append(ary, n-1)
04 ary << n
05 return ary
06 end
我理解reverse_append函数执行此操作:
我不明白的是,如果第02行说明如果n小于0则返回数组(根据我的理解,它将为空)。这是什么流程图?
答案 0 :(得分:1)
递归的关键:有许多相同函数的调用处于活动状态。每个调用都有自己的局部变量。 返回仅从当前的innvovcation返回。
调用函数树将如下所示
reverse_append([], 2)
..reverse_append([], 1)
....reverse_append([], 0)
......reverse_append([], -1)
......returns []
....[] << 0
....returns [0]
..[0] << 1
..-> [0, 1]
[0, 1] << 2
-> [0, 1, 2]
答案 1 :(得分:1)
您的reverse_append
可以改写为:
def reverse_append(ary, n)
return ary if n < 0
reverse_append(ary, n-1)
ary << n
end
这使得append(ary, n)
与<<
的差异与递归调用的顺序更加明显。 append()
说&#34;如果我没有达到负值,请将我的n
连接到数组,然后获取连接产生的数组所有较小的n
值并返回&#34;,而reverse_append()
表示&#34;如果我没有得到负值,请获取连接所有较小值的数组n
,然后将我的n
连接到结果并返回。&#34;如果您考虑一下,您应该看到这决定了值附加的顺序。