如何在递归方法中返回具有累积值的数组

时间:2016-06-27 14:17:16

标签: ruby recursion

我正在尝试使用两个值timesnumber并返回number重复times次的数组。这是一个例子:

replicate(3, 5) # => [5, 5, 5]

这是我的尝试1:

@array = []

def replicate(times, number)
  return [] if times <= 0
  @array << number 
  replicate(times - 1, number)
  @array
end

当我单独运行每个测试用例一次时,我会传递所有内容。但是,当我同时运行它们时,它会失败; @array包含每个测试用例的所有值,@array在整个测试套件的末尾将如下所示:

@array # => [5, 5, 5, 1, 1, 1, 1, 2, 2]

以下是实施二:

def replicate(times, number)
  return [] if times <= 0
  array = []
  array << number 
  replicate(times - 1, number)
  array
end

这将只返回一个值,因为递归将为每次运行创建一个本地副本。

如何返回一个使测试用例通过的数组?我不能使用全局变量或实例变量,也不能使用数组的本地副本。我之间可以使用什么东西吗?

3 个答案:

答案 0 :(得分:5)

将累加器数组传递给递归调用:

def replicate(times, number, array=[])
   return [] if times <= 0
   array << number
   replicate(times - 1, number, array)
   array
end

replicate(3, 5)
=> [5, 5, 5]

答案 1 :(得分:5)

在这种情况下,不需要将累加器保留为实例变量或参数。您需要做的就是连接此调用的结果(这将是一个包含单个元素的数组,即[ number ])以及后续调用的结果:

def replicate(times, number)
  return [] if times <= 0
  [ number ] + replicate(times - 1, number)
end

如果你想使用累加器,你可以这样做:

def replicate(times, number, accum=[])
  return accum if times <= 0
  replicate(times - 1, number, accum + [ number ])
end

(请注意,您也可以使用accum << number,但我个人更喜欢在编写递归函数时将数据结构视为不可变 - 因为,它是一个大写F函数,函数不应该有 - 作用。)

答案 2 :(得分:0)

为什么不简单地做:

[number]*times

示例:

$ irb
2.3.0 :001 > [1]*5
 => [1, 1, 1, 1, 1]