2016-07-02 3 views
0

Grüße gute Leute von Stackland!Wie kann ich diese Fibonacci-Sequenzbewertung in R abschließen?

Vor kurzem wurde ich diese Aufgabe

  • die Fibonacci-Folge in jeder Sprache
  • auswerten generieren gegeben, ob jeder Wert gerade oder ungerade ist
  • Summe der geraden Zahlen, so dass ihr Gesamt nicht> 500.000
  • ist

Ich entschied mich, dies zu tun R, wie ich die Sprache lerne und dachte, es wäre eine gute Übung dabei.

Ich habe es geschafft, Schritt 2 der Aufgabe abzuschließen, konnte aber nicht weiter verfahren. Bitte beachten Sie Code und Kommentare unten.

len <- 50 
    fibvals <- numeric(len) 
    fibvals[1] <- 1 
    fibvals[2] <- 1 
    for(i in 3:len) { fibvals[i] <- fibvals[i-1]+fibvals[i-2]} 
    fibvals 
    [1]   1   1   2   3   5 
    [6]   8   13   21   34   55 
    [11]   89   144   233   377   610 
    [16]   987  1597  2584  4181  6765 
    [21]  10946  17711  28657  46368  75025 
    [26]  121393  196418  317811  514229  832040 
    [31]  1346269  2178309  3524578  5702887  9227465 
    [36] 14930352 24157817 39088169 63245986 102334155 
    [41] 165580141 267914296 433494437 701408733 1134903170 
    [46] 1836311903 2971215073 4807526976 7778742049 12586269025 

    # Creates a variable called len in which the value 50 is stored 
    # Creates a var called fibvals, which is a numeric datatype, which should have len (50) vals 
    # Sets the value of the first entry in fibvals to 1 
    # Sets the value of the second entry in fibvals to 1 
    # Loop - "for (i in 3:len)" dictates that the loop should be executed between step 3 and step 50 (denoted by "len") 
    # Loop - Defines a loop step "i" as being the result of the (current i - the before it) + (current i - i two before it) 
    # Loop - Example 5 = (5-3) + (5-2) OR 2 + 3 = 5 | Example 21 = (21-13) + (21-8) OR 8 + 13 = 21 

    is.even <- function(x){ x %% 2 == 0 } 

    # Creates a UDF to check if values are odd or even by using modulo. 
    If the remainder is 0 when any value is divided by 2, it is an even number 

is.even(fibvals) 

[1] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE 
[11] FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE 
[21] TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE 
[31] FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE 
[41] FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE FALSE FALSE 

# Evaluates all Fibonacci values on odd or even property 

Was ich brauche, ist ein bisschen Anleitung, wohin ich von hier aus gehen sollte. Soll ich eine data.table erstellen und diese mit dem SQL-Paket abfragen, oder gibt es eine elegantere und weniger umständliche Methode?

Vielen Dank im Voraus!

+0

In Schritt 3 tun Sie meinen, dass Sie alle Kombinationen von selbst 'fibvals'as solange die Summe der Kombination finden werden ist kleiner als 500000? – Psidom

+0

@Psidom - Entschuldigung, wenn das unklar war. Ziel ist hier, NUR die geraden Fibeln zu summieren, wobei die Summe 500.000 nicht übersteigt. Ist das klarer? – jimiclapton

+0

Aber es gibt noch viele Möglichkeiten, zum Beispiel '2, 4, 6, 8, 10' und die Schwelle ist' 10', sollte ich '2 + 4' oder' 2 + 6' summieren? Sie können nicht alle '2,4,6' in Ihre Sequenz aufnehmen, da ihre Summe '12' ist. – Psidom

Antwort

3

Für die gerade Zahl von ersten 50 Fibonacci-Zahlen Aussortieren können Sie diese verwenden

even_numbers <- fibvals[fibvals%%2==0] 

Dann durch kumulative Summe dieser geraden Zahlen Berechnung und den Zustand des maximalen Wertes der Summe auferlegt, können Sie auswählen, diese geraden Zahlen von diesem

cumsum(even_numbers)<500000 

Daher gewünschten Fibonacci Zahlen sind

even_numbers[cumsum(even_numbers)<500000] 

und ihre sum ist

sum(even_numbers[cumsum(even_numbers)<500000]) 
0

Dieses es

fsum <- 0 
for (i in 1:len) { if (is.even(fibvals[i]) && (fsum + fibvals[i])<=500000) {fsum = fsum + fibvals[i]}} 

Die Summe dann in fsum gespeichert würden tun würde.

0

Hier ist ein Weg, um es mit einer rekursiven Funktion zu tun:

getEvenWithFibber <- function(y = c(1,1), 
          s = 0, 
          threshold = 500000) { 
if(s + y[1] + y[2] < threshold) 
    getEvenWithFibber(y = c(y[1] + y[2],y), s = s + ifelse(y[1]%%2==0,y[1],0)) 
else list(sum = s, seq = y, iseven = y%%2 == 0) 
} 


getEvenWithFibber() 
Verwandte Themen