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