难以理解Ruby中的递归

时间:2015-10-22 15:41:15

标签: ruby function recursion return

我正在关注递归的视频,它在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&lt;如果是,则返回0,返回数组。
  • 03调用自身,参数n减去1

我不明白的是,如果第02行说明如果n小于0则返回数组(根据我的理解,它将为空)。这是什么流程图?

2 个答案:

答案 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;如果您考虑一下,您应该看到这决定了值附加的顺序。