我试图以斐波那契顺序保存所有项,直到给定数字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)
的输出?谢谢!
我认为您有两种方法可以做到:
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
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
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
如果要将此操作作为递归操作,则需要将每个项目附加到列表的前面(取决于您希望元素放入的顺序。
您也可以将其作为for循环来执行,然后索引将更简单。您可以使用已经编写的函数,但是效率不高。访问数组的i-1和i-2元素以计算第ith个元素会更快。
现在您不在任何位置存储前面的元素。