R-连分数
R- continued fraction
给定一个数值向量,是否可以在 R 中创建用于连分数估计的函数?
公式为:
我们可以定义一个递归函数f
来计算连分数
f <- function(v) {
ifelse(length(v) == 1, v, v[1] + 1 / f(v[-1]))
}
但缺点是递归深度有限制,如
> f(1:1e5)
Error: node stack overflow
因此,如果您有一个大数组 v
,更好的选择可能是使用 for
循环,例如,
f <- function(v) {
if (length(v) == 1) {
return(v)
}
s <- tail(v, 1)
for (k in (length(v) - 1):1) {
s <- v[k] + 1 / s
}
s
}
你会看到
> f(1:1e5)
[1] 1.433127
使用递归一个选项来实现您想要的结果可能如下所示:
cfrac <- function(x) {
n <- length(x)
if (n > 1) {
res <- x[1] + 1 / cfrac(x[2:n])
} else {
res <- x
}
return(res)
}
identical(cfrac(2), 2)
#> [1] TRUE
identical(cfrac(c(2, 3)), 2 + 1 / 3)
#> [1] TRUE
identical(cfrac(c(-3, 2, 18)), -3 + 1 / (2 + 1 / 18))
#> [1] TRUE
双向工具都在包里contfrac
给定一个数值向量,是否可以在 R 中创建用于连分数估计的函数?
公式为:
我们可以定义一个递归函数f
来计算连分数
f <- function(v) {
ifelse(length(v) == 1, v, v[1] + 1 / f(v[-1]))
}
但缺点是递归深度有限制,如
> f(1:1e5)
Error: node stack overflow
因此,如果您有一个大数组 v
,更好的选择可能是使用 for
循环,例如,
f <- function(v) {
if (length(v) == 1) {
return(v)
}
s <- tail(v, 1)
for (k in (length(v) - 1):1) {
s <- v[k] + 1 / s
}
s
}
你会看到
> f(1:1e5)
[1] 1.433127
使用递归一个选项来实现您想要的结果可能如下所示:
cfrac <- function(x) {
n <- length(x)
if (n > 1) {
res <- x[1] + 1 / cfrac(x[2:n])
} else {
res <- x
}
return(res)
}
identical(cfrac(2), 2)
#> [1] TRUE
identical(cfrac(c(2, 3)), 2 + 1 / 3)
#> [1] TRUE
identical(cfrac(c(-3, 2, 18)), -3 + 1 / (2 + 1 / 18))
#> [1] TRUE
双向工具都在包里contfrac