我正在尝试使用两个值times
和number
并返回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
这将只返回一个值,因为递归将为每次运行创建一个本地副本。
如何返回一个使测试用例通过的数组?我不能使用全局变量或实例变量,也不能使用数组的本地副本。我之间可以使用什么东西吗?
答案 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]