假设您有一个函数,它以数字作为输入并输出向量。然而,输出向量的大小取决于输入,并且在函数之前无法计算。
例如,考虑 3N+1著名算法。该算法的简单实现,返回到1的整个路径可能如下所示:
例如,考虑 3N+1著名算法。该算法的简单实现,返回到1的整个路径可能如下所示:
compute <- function(x) {
if (x %% 2 == 0)
return(x / 2)
return(3*x + 1)
}
algo <- function(x) {
if (x == 1)
return(1)
output <- x
while(x != 1) {
x <- compute(x)
output <- c(output, x)
}
return(output)
}
algo
函数根据函数的要求返回输入X到1的整个路径。正如您所看到的,output
变量使用c()
(合并)函数动态增长。
是否有其他替代方法?增加列表速度更快吗?我应该采用一些经典的动态向量逻辑,比如初始化一个空的N大小的向量,并在每次满时将其加倍?
编辑:请不要试图优化我的辅助函数的结构。我明白,但这不是重点!我只关心c()
函数及其替代方案。
n <- sapply(1:1e6, function(x) length(algo(x)))
,输出向量的最大长度为525。 - dcarlson