【发布时间】:2017-08-27 03:36:46
【问题描述】:
就完成时间而言,以下哪项更有效?
one.way = function(n) { if (n) c(n, one.way(n-1)) }
two.way = function(n) { if (n) c(two.way(n-1), n) }
这里的重点是单例向量与另一个长度可能大于一的向量的组合顺序。
如果您需要在使用上述函数之一构建向量后包含反转向量的时间,您的答案将如何变化?在组合时可能知道也可能不知道需要组合对象的顺序。
【问题讨论】:
-
他们都超级慢,因为growing things without preallocating memory is slow。在这种情况下,
seq或:会快得多。 -
如前所述,“这里的重点在于将单个向量与另一个长度可能大于 1 的向量组合的顺序。”我给出了一个简单的例子,但许多其他情况也是可能的。
-
我知道。重点是不要。取而代之的是向量化你的操作,或者至少预先分配一个适当长度的向量,否则 R 会变得非常缓慢。
-
我是说不要递归/迭代地这样做;有更好的方法。如果你只做一次,你可以选择
c(1, vec)或c(vec, 1),这取决于你在输出中首先想要什么。 -
是否有令人信服的理由采用递归/迭代方法?由于上面突出显示的问题,在 R 中通过循环迭代地做某事很少是问题的第一个答案。如果您觉得必须使用它,请详细说明您的情况并解释为什么其他方法不起作用。现在这听起来可能是XY problem。
标签: r recursion vector accumulate