首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >初学者在R比率中学习Fibonnaci

初学者在R比率中学习Fibonnaci
EN

Stack Overflow用户
提问于 2021-02-08 19:51:56
回答 3查看 43关注 0票数 0

我是一个尝试学习R的初学者。我有以下代码来查找20个第一个Fibon

代码语言:javascript
运行
复制
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的斐波那契数和前一个斐波那契数之间的比率。如何简单地做到这一点呢?我试过了

代码语言:javascript
运行
复制
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来说非常陌生

EN

回答 3

Stack Overflow用户

发布于 2021-02-08 19:56:38

看起来已经很不错了。当您使用:list<-c()正确地初始化名为list的向量时,这应该会起作用

票数 0
EN

Stack Overflow用户

发布于 2021-02-08 19:58:47

你的解决方案看起来不错。不过,一般来说,没有必要重新发明轮子。R的一个优点是使用包。为此,我建议使用numbers包创建斐波纳契数,然后使用lag创建比率,即

代码语言:javascript
运行
复制
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编程方面的最佳实践,您可以从中学到很多东西。

代码语言:javascript
运行
复制
> 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>
票数 0
EN

Stack Overflow用户

发布于 2021-02-08 19:59:20

向量化操作,不需要循环。

代码语言:javascript
运行
复制
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

要了解它的工作原理,请打印分子和分母。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66101098

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档