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)
fib(8)1 1 2 3 5 8 13 21
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