如何将斐波那契数列中的所有项保存到`n`
how to save all terms in Fibonacci sequence till `n`
我试图将斐波那契数列中的所有项目保存到给定的数字 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)
的输出吗?谢谢!
如果您想以递归的方式执行此操作,则需要将每个项目附加到列表的前面(取决于您希望元素在其中的顺序。
您也可以将其作为 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
我试图将斐波那契数列中的所有项目保存到给定的数字 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)
的输出吗?谢谢!
如果您想以递归的方式执行此操作,则需要将每个项目附加到列表的前面(取决于您希望元素在其中的顺序。
您也可以将其作为 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