从R中的函数输出计算偶数

时间:2016-10-07 03:45:51

标签: r fibonacci

我正在研究Euler Problems,问题是将Fibonacci序列中的偶数项加到最后一项的长度< 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)   
}

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

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,从第一个块到第三个,唯一的区别是“数字”序列。

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

1 个答案:

答案 0 :(得分:1)

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

了解您的身份for (i in numbers)。因此(例如)在考虑numbers中的Fibbonaci编号2584时,您正在设置total[2584] <- 1

你的最终total向量是3524578个元素长(!!),只需要32个长。您未存储结果的所有其他元素都设置为NAsum的{​​{1}}为NA

将您的斐波纳契数(可以任意大)从您的索引中分离到NA(最多只能达到32)。要制作索引,您可以使用基本为total的{​​{1}}。然后使用seq_along(numbers)获取斐波那契数字。

1:length(numbers)