如何在斐波那契数列中保存所有术语,直到'n`

问题描述 投票:1回答:2

我试图以斐波那契顺序保存所有项,直到给定数字n。例如,如果函数为fib,则预期输出为

  • [1 1 2代表fib(3)]
  • [1 1 2 3 5代表fib(5)]
  • [1 1 2 3 5 8 13 21代表fib(8)]

依此类推。

我的代码是

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

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

是否有线索将元素从1保存到n作为fib(n)的输出?谢谢!

r fibonacci
2个回答
2
投票

我认为您有两种方法可以做到:

  • 方法1:以递归方式重新定义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

1
投票

如果要将此操作作为递归操作,则需要将每个项目附加到列表的前面(取决于您希望元素放入的顺序。

您也可以将其作为for循环来执行,然后索引将更简单。您可以使用已经编写的函数,但是效率不高。访问数组的i-1和i-2元素以计算第ith个元素会更快。

现在您不在任何位置存储前面的元素。

© www.soinside.com 2019 - 2024. All rights reserved.