【问题标题】:Count even numbers from function output in R从R中的函数输出计算偶数
【发布时间】:2016-10-07 03:45:50
【问题描述】:

我正在处理Euler Problems,问题是将斐波那契数列中的偶数项求和到最后一项小于 4e6 的长度。我最终得到了它,但是以下计算偶数的方法不起作用,我很好奇为什么。

首先,这种从序列中计算偶数的方法是有效的:

numbers <- 1:32
N <- length(numbers)
total <- rep(0,N)
for (i in numbers){
  if(i %% 2 == 0) total[i] <-i
  }   
sum(total) #272

那么,这个 Fibb 序列就起作用了:

Fibb<-function(x){
  y <- 1:x
  y[1] = 1
  y[2] = 2
  for (i in 3:x){
    y[i] <- y[i-2] + y[i-1]
  }
  return(y)   
}

但我在第一个序列中使用的相同 sum 函数不起作用:

numbers <- as.integer(Fibb(32)) # 1, 2, 3, 5, 8, 13, 21...
N <- length(numbers)
total <- rep(0,N)
for (i in numbers){
  if(i %% 2 == 0) total[i] <-i
  }  
sum(total) #NA

第三块的total 是一个大数字,主要由 NA 组成。

编辑:我想知道的是为什么第一个代码块中的循环正确运行,而不是第三个代码块中的循环;我复制并粘贴了 6-7 个,从第一个块到第三个块,唯一的区别是“数字”序列。

有人遇到过这样的问题吗? 谢谢!

【问题讨论】:

  • 总而言之,利用索引和矢量化来避免循环。例如:total = cumsum(numbers[numbers %% 2 == 0]).
  • 是的,最终我选择了 flag
  • 查看numbers 的第一个版本和numbers 的第二个版本的值,注意这是numbers 而不是indexnumbers,您将其用作循环索引。还要看循环后total的长度和值。

标签: r fibonacci


【解决方案1】:

这是因为您使用numbers 的元素作为total 的索引。

看看你如何拥有for (i in numbers)。因此(例如)在考虑numbers 中的斐波那契数 2584 时,您设置的是 total[2584] &lt;- 1

您最终的 total 向量长度为​​ 3524578 个元素(!!),而它只需要 32 个长度。您不存储结果的所有其他元素都设置为NANAsumNA

将您的斐波那契数(可以任意大)从您的索引中分离到total(最多只能达到 32)。要创建索引,您可以使用seq_along(numbers),它本质上是1:length(numbers)。然后使用numbers[i] 得到那个斐波那契数。

for (i in seq_along(numbers)) {
    if(numbers[i] %% 2 == 0) total[i] <- 1
}

【讨论】:

  • 嗨数学咖啡,
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多