【发布时间】: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的值 而不是index 的numbers,您将其用作循环索引。还要看循环后total的长度和值。