我是一个尝试学习R的初学者。我有以下代码来查找20个第一个Fibon
Fibonacci <- numeric(20)
Fibonacci[1] <- Fibonacci[2] <- 1
for (i in 3:20) Fibonacci[i] <- Fibonacci[i - 2] + Fibonacci[i - 1]
print(Fibonacci)
这行得通,给了我前20个数字。然而,我想尝试找出{3,..,20}中每个元素n的斐波那契数和前一个斐波那契数之间的比率。如何简单地做到这一点呢?我试过了
Fibonacci <- numeric(20)
Fibonacci[1] <- Fibonacci[2] <- 1
for (i in 3:20) Fibonacci[i] <- Fibonacci[i - 2] + Fibonacci[i - 1]
print(Fibonacci)
q<-c(Fibonacci)
lists<-c()
for(i in 3:20)
list[[i]] <- q[i]/q[i-1]
print(list)
我的想法是用斐波那契数(q)做一个向量,然后用所有改变过的元素做一个列表,找出比率,然后打印出来。有什么建议吗?
这里有新的海报,对R来说非常陌生
发布于 2021-02-08 19:56:38
看起来已经很不错了。当您使用:list<-c()
正确地初始化名为list的向量时,这应该会起作用
发布于 2021-02-08 19:58:47
你的解决方案看起来不错。不过,一般来说,没有必要重新发明轮子。R的一个优点是使用包。为此,我建议使用numbers
包创建斐波纳契数,然后使用lag
创建比率,即
fib <- numbers::fibonacci(20, sequence = TRUE)
rel.fib <- fib/lag(fib)
rel.fib <- rel.fib[-1]
> rel.fib
[1] 1.000000 2.000000 1.500000 1.666667 1.600000
[6] 1.625000 1.615385 1.619048 1.617647 1.618182 1.617978
[12] 1.618056 1.618026 1.618037 1.618033 1.618034 1.618034
[18] 1.618034 1.618034
Extra
通过编写numbers:::fibonacci
,您甚至可以看到生成斐波那契数的函数的源代码。这很有用,因为它确认了您的策略,并提供了R编程方面的最佳实践,您可以从中学到很多东西。
> numbers:::fibonacci
function (n, sequence = FALSE)
{
if (!is.numeric(n) || length(n) != 1 || floor(n) != ceiling(n) ||
n < 0)
stop("Argument 'n' must be a single integer >= 0.")
if (n <= 0)
return(0)
if (n == 1)
return(1)
if (n > 78)
warning("For 'n > 78' not exactly representable in R as integer.")
if (sequence) {
if (n == 2)
return(c(1, 1))
fib <- numeric(n)
fib[1:2] <- c(1, 1)
for (k in 3:n) {
fib[k] <- fib[k - 1] + fib[k - 2]
}
}
else {
if (n == 2)
return(1)
f1 <- 1
f2 <- 1
for (i in 1:(n - 2)) {
t <- f2
f2 <- f1 + f2
f1 <- t
}
fib <- f2
}
return(fib)
}
<bytecode: 0x0000017c1c9dbed0>
<environment: namespace:numbers>
发布于 2021-02-08 19:59:20
向量化操作,不需要循环。
Fibonacci[-1]/Fibonacci[-length(Fibonacci)]
# [1] 1.000000 2.000000 1.500000 1.666667 1.600000 1.625000 1.615385
# [8] 1.619048 1.617647 1.618182 1.617978 1.618056 1.618026 1.618037
#[15] 1.618033 1.618034 1.618034 1.618034 1.618034
要了解它的工作原理,请打印分子和分母。
https://stackoverflow.com/questions/66101098
复制相似问题