我想找到数据形式的回溯序列(因为它是从Collatz猜想tibble数据从1到10,000)在某个点上超过该序列的起始值。
这是我的 Dataframe 输出:
structure(list(start = 1:6, seq = list(1L, c(2, 1), c(3, 10,
5, 16, 8, 4, 2, 1), c(4, 2, 1), c(5, 16, 8, 4, 2, 1), c(6, 3,
10, 5, 16, 8, 4, 2, 1)), length = c(1, 2, 8, 3, 6, 9), parity = c("Odd",
"Even", "Odd", "Even", "Odd", "Even"), max_val = c(1, 2, 16,
4, 16, 16)), row.names = c(NA, -6L), class = c("tbl_df", "tbl",
"data.frame"))
我是这样做的:
has_backtrack <- function(seq) {
length_seq <- length(seq)
if (length_seq < 3) {
return(FALSE)
}
for (i in 2:(length_seq - 1)) {
if (seq[i] < seq[1] && seq[i + 1] > seq[i]) {
return(TRUE)
}
}
}
然而,对于我目前的代码,它只显示序列是否增加,但不超过第一个值。
Backtracks def:当一个序列达到一个小于起始整数的值,但随后再次增加到起始值/整数之上时,它可以在达到1之前至少增加一次。
2条答案
按热度按时间vuv7lop31#
考虑
z
作为第一个值之后的余数。在 id(cumsum(z < x[1]) > 1
)上设置z
子集,并查看其中的any
是否为TRUE
。使用
sapply
或者是
Vectorize
d。假设所需的“整数6”意味着
which
序列有回溯,你可以相应地得到它:qvsjd97n2#
我不确定以下是你想要的。它使用R的向量化指令来获取输入序列在一条指令中增加的所有点,使代码变得更简单,没有
for
循环。函数
has_backtrack
返回序列增加的点的索引,而不是序列值。函数
next_collatz
和collatz
受this R-bloggers code的启发。创建于2023-09-24使用reprex v2.0.2
另一个例子,具有严格递减的输入Collatz序列。
创建于2023-09-24使用reprex v2.0.2
编辑
对于问题中发布的数据集,Collatz序列列是一个列表列,函数
has_backtrack
可以如下进行lapply
编辑。结果表明
创建于2023-09-24使用reprex v2.0.2
要获得增加点 * 之前的值,请使用
Map
。创建于2023-09-24使用reprex v2.0.2
数据
创建于2023-09-24使用reprex v2.0.2