Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何将斐波那契序列中的所有项保存到'n`_R_Fibonacci - Fatal编程技术网

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

R 如何将斐波那契序列中的所有项保存到'n`,r,fibonacci,R,Fibonacci,我试图保存斐波那契序列中的所有项目,直到给定的数字n。例如,如果函数为fib,则预期输出为 fib(3) 1 1 2 3 5对于fib(5) 1 1 2 3 5 8 13 21fib(8) 诸如此类 我的代码是 fib <- function(n) { if (n<= 2) { return(1) } else { return(f(n-1)+f(n-2)) } } fib如果您想作为递归执行此操作,则需要将每个项附加到列表的前面(取决于您希望元素的

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

  • 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))
  }
}

fib如果您想作为递归执行此操作,则需要将每个项附加到列表的前面(取决于您希望元素的顺序)

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


现在,您没有将前面的元素存储在任何位置。

我认为有几种方法可以实现:

  • 方法1:以递归方式重新定义
    fib
  • 方法2:使用您的
    fib
    ,但使用
    sapply
  • 方法3:使用
    进行
    循环(我认为这是三种方法中最有效的一种)

这是一个彻底的答案,+1但我要提醒的是#2是浪费性的昂贵。基准测试会给出更彻底的答案。@C8H10N4O2是的,我同意
fib2
不是一个聪明的答案。我个人更喜欢
for
循环非常感谢,你的回答太棒了!
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
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
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