如何将斐波那契数列中的所有项保存到`n`

how to save all terms in Fibonacci sequence till `n`

我试图将斐波那契数列中的所有项目保存到给定的数字 n。例如,如果函数是 fib,我预期的结果是

等等等等。

我的密码是

fib <- function(n) {
  if (n<= 2) {
    return(1)
  } else {
    return(f(n-1)+f(n-2))
  }
}

但它只给出斐波那契数列中第 n 个元素的单个值。

有什么线索可以将 1n 的元素保存为 fib(n) 的输出吗?谢谢!

如果您想以递归的方式执行此操作,则需要将每个项目附加到列表的前面(取决于您希望元素在其中的顺序。

您也可以将其作为 for 循环执行,这样索引会更直接。您可以使用您已经编写的函数,但效率很低。访问数组的 i-1 和 i-2 元素来计算第 i 个元素会更快。

现在您没有在任何地方存储前面的元素。

我想你有几种方法可以做到:

  • 方法一:以递归的方式重新定义fib
fib <- function(n) {
  if (n<=2) return(rep(1,n))
  c(u <- Recall(n-1),sum(tail(u,2)))
}

这样

> fib(10)
 [1]  1  1  2  3  5  8 13 21 34 55

> fib(20)
 [1]    1    1    2    3    5    8   13   21   34   55   89
[12]  144  233  377  610  987 1597 2584 4181 6765
  • 方法 2: 使用您的 fib 但使用 sapply
fib1 <- function(n) sapply(seq(n),fib)

这样

> fib1(10)
 [1]  1  1  2  3  5  8 13 21 34 55

> fib1(20)
 [1]    1    1    2    3    5    8   13   21   34   55   89
[12]  144  233  377  610  987 1597 2584 4181 6765
  • 方法 3: 使用 for 循环(我认为这将是三种方法中最有效的一种
fib2 <- function(n) {
  r <- rep(1,n)
  if (n>=3) {
    for (k in 3:n) {
      r[k] <- sum(r[k-(1:2)])
    }
  }
  r
}

这样

> fib2(10)
 [1]  1  1  2  3  5  8 13 21 34 55

> fib2(20)
 [1]    1    1    2    3    5    8   13   21   34   55   89
[12]  144  233  377  610  987 1597 2584 4181 6765