2016-10-07 9 views
1

で計算しています。私はEuler Problemsで作業していますが、フィボナッチ数列の最後の項が< 4e6である偶数項を合計するのが問題です。私はそれを最終的に得ましたが、偶数を数える以下の方法はうまくいかず、なぜ私は興味があります。関数出力の偶数をR

まず、シーケンスから偶数をカウントするこの方法は動作します:

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) 
} 

が、私は最初のシーケンスdoesnの上で使用したのと同じ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 

3番目のチャンクのtotalは大ほとんどがNAsで構成されています。

編集:私が知りたいのは、最初のコードブロックのループが正しく動作し、3番目のループではないことです。最初の塊から3番目の塊にコピーして貼り付けたのは唯一の違いは "数列"です。

誰もこのような問題が発生しましたか? ありがとう!

+1

合計の場合、インデックス作成とベクトル化を利用してループを回避します。たとえば、 'total = cumsum(numbers [numbers %% 2 == 0])'などです。 – eipi10

+0

結局私は一緒に行った フラグ< - numbers %% 2 == 0 qq < - sum(numbers [flag]) しかし、私はなぜ2つのループが全く同じ構文で異なる結果をもたらすのか不思議です1行です。 –

+1

'numbers'の最初のバージョンの値と' numbers'の2番目のバージョンの値を見て、あなたが使っている 'numbers'の* index *ではなく' numbers'の* values *ループインデックス。また、ループの後に 'total'の長さと値を見てください。 – eipi10

答えて

1

numbersの要素をインデックスとしてtotalに使用しているためです。

for (i in numbers)さんの情報を確認してください。たとえば、numbersのFibbonaci番号2584を考慮する場合は、total[2584] <- 1と設定します。

あなたの最終的なtotalベクトルは、長さが32である必要があるだけで3524578要素(!!)です。結果を格納しないその他の要素はすべてNAに設定され、sumNAに設定されます。NAです。

インデックスからフィボナッチ数(任意に大きくてもよい)をtotal(32文字まで)に区切ります。インデックスを作成するにはseq_along(numbers)を使用します。本質的には1:length(numbers)です。その後、numbers[i]を使用してフィボナッチ数を取得します。

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

こんにちは数学的コーヒー、 –