【问题标题】:Begineers learning to Fibonnaci in R. Ratios初学者在 R. Ratios 中学习斐波那契
【发布时间】:2021-02-08 11:51:55
【问题描述】:

我是一个尝试学习 R 的初学者。我有以下代码来找到第 20 个斐波那契

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 来说非常新

【问题讨论】:

    标签: r for-loop fibonacci


    【解决方案1】:

    看起来已经很不错了。当您使用以下命令正确初始化名为 list 的向量时,这应该可以工作:list&lt;-c()

    【讨论】:

      【解决方案2】:

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

      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
      

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

      【讨论】:

      • 但是我用这种方式得到了太多。 n 在 3,...,20 的元素中,即第一个点 1.00000... 应该被删除。我该怎么做?
      • @mathstudent23 如果result 是答案中除法的结果,那么您想要的是result[-1]
      【解决方案3】:

      您的解决方案似乎很好。一般来说,没有必要重新发明轮子。 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
      

      额外

      通过编写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>
      

      【讨论】:

      • 但是我用这种方式得到了太多。 n 在 3,...,20 的元素中,即第一个点 1.00000... 应该被删除。我该怎么做?
      • rel.fib &lt;- rel.fib[-1]。我在上面编辑了我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 2018-07-11
      • 2015-10-19
      • 1970-01-01
      相关资源
      最近更新 更多