gpt4 book ai didi

r - 如何在 R 中有效地增长向量?

转载 作者:行者123 更新时间:2023-12-04 07:16:15 25 4
gpt4 key购买 nike

假设您有一个将数字作为输入并输出向量的函数。但是,输出向量大小取决于输入,您不能在函数之前计算它。

例如,取 3N+1 famous algorithm .该算法的一个简单实现,返回整个路径直到 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() 函数及其替代方法。

最佳答案

更新

根据您的编辑,也许您可​​以检查以下解决方案

algo_TIC2 <- function(x) {
res <- x
repeat {
u <- tail(res, 1)
if (u != 1) {
res[length(res) + 1] <- if (u %% 2) 3 * u + 1 else u / 2
} else {
return(res)
}
}
}

你可以像下面这样使用递归

compute <- function(x) if (x %% 2) 3*x + 1 else x / 2
algo_TIC1 <- function(x) {
if (x == 1) {
return(1)
}
c(x, algo_TIC1(compute(x)))
}

你会看到

> algo_TIC1(3000)
[1] 3000 1500 750 375 1126 563 1690 845 2536 1268 634 317 952 476 238
[16] 119 358 179 538 269 808 404 202 101 304 152 76 38 19 58
[31] 29 88 44 22 11 34 17 52 26 13 40 20 10 5 16
[46] 8 4 2 1

如果你不需要任何辅助函数,即compute,你可以试试

algo_TIC1 <- function(x) {
if (x == 1) {
return(1)
}
c(x, algo_TIC1(if (x %% 2) 3*x + 1 else x / 2))
}

关于r - 如何在 R 中有效地增长向量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68732804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com