2017-03-12 10 views
1

Könnte mir jemand helfen, ich verstehe nicht, was das Problem hier ist. Ich habe gerade angefangen R zu lernen (vor ein paar Tagen). Hier muss ich eine Funktion konstruieren, die mir alle Marsenne-Primzahlen gibt, nachdem ich Marsenne-Zahlen erstellt habe. Es gibt 3 Funktionen, die ich erstellt habe: 1) factorlist Finden Sie einfach alle Faktoren einer Nummer 2) Marsenne Zahl ist eine Funktion, die Marsenne-Nummern erstellt 3) CheckForMersennePrimes ist eine Funktion, die überprüft, ob fundierte Mersenne-Zahlen Primzahl sind oder nicht. *** Funktion "Primzahlen" gibt alle Primzahl, die im Intervall von 0 bis x"Keine Funktion, um von der obersten Ebene zurück zu springen"

sind

Das Problem ist: First 2 Funktionen funktioniert einwandfrei. Aber der dritte funktioniert nicht und gibt folgenden Fehler. Ich kann nicht verstehen, was überhaupt falsch ist. Was ich versucht habe, ist, dass Mersenne-Zahlen nicht alle Primzahlen sind. Ich schaue in den Satz von MersenneNumber und prüfe jedes Element darin, ob es prim ist oder nicht und dann entferne es.

Kann jemand bitte helfen, was falsch zu finden?

Hier sind meine Funktionen:

factorlist<-function(x) { 
    if (x<2) {return ("Invalid input")} 
    if (x%%1!=0) {return ("Invalid input")} 
    if (x==2) {return(2)} 
    if (x==3) {return(3)} 
    vec<-0 
    for(i in 1:x){ 
    if(x%%i==0){ 
     vec[length(vec)]<-i 
     vec<-c(vec,0) 
    } 
    } 
    vec<-vec[-length(vec)] 
    vec<-vec[-length(vec)] 
    return(vec) 
} 

primes <- function(n){ 
    primesR <- function(p, i = 1){ 
    f <- p %% p[i] == 0 & p != p[i] 
    if (any(f)){ 
     p <- primesR(p[!f], i+1) 
    } 
    p 
    } 
    primesR(2:n) 
} 

MarsenneNumber<-function(x){ 
    vec<-c(0) 
    for (i in 3:x){ 
    vec<-union(vec, c(2^primes(i)-1)) 
    } 
    return(vec[-length(1)]) 
} 

CheckForMersennePrimes<-function(x){ 
    b<-length(MarsenneNumber(x)){ 
    for (i in 1:b){ 
     vec<-MarsenneNumber(x){ 
     if (factorlist(vec[i])!=1){ 
      vec<-c(-vec[i]) 
     } 
     } 
    } 
    } 
    return(vec) 
} 

Mein Fehler zur letzten Funktion:

Error: unexpected '}' in "  }" 
>  } 
Error: unexpected '}' in " }" 
> } 
Error: unexpected '}' in " }" 
> return(vec) 
Error: no function to return from, jumping to top level 
> } 
Error: unexpected '}' in "}" 

Hier ist ein Beispiel dafür, wie diese Funktionen arbeiten.

> factorlist(20) 
[1] 1 2 4 5 10 

> primes(20) 
[1] 2 3 5 7 11 13 17 19 

> MarsenneNumber(20) 
[1]  3  7  31 127 2047 8191 131071 524287 

Antwort

2

CheckForMersennePrimes hat extra {} auf Leitung 2 und Leitung 4 (innen for-Schleife) diese Funktion, wie vec<-MarsenneNumber(x){if()...}

I diese zusätzliche Klammern entfernt.

CheckForMersennePrimes <- function(x){ 
    b <- length(MarsenneNumber(x)) 
    for (i in 1:b){ 
    vec <- MarsenneNumber(x) 
    if (factorlist(vec[i]) != 1){ 
     vec <- c(-vec[i]) 
    } 
    } 
    return(vec) 
} 

denke ich, ist Ihre Absicht Wert von vec zu erhalten, in der factorlist(vec[i]) gleich 1 ist Wenn dies wahr ist, dann müssen Sie vec außerhalb der for-Schleife initiiert und für diesen Zustand zu überprüfen. Dann geben Sie schließlich a1 zurück, das alle vec Werte enthält, die den if Zustand übergeben.

Ich habe auch Ihren Code gekürzt, indem Sie b Variable entfernt. Du brauchst es nicht. Stattdessen könnten Sie seq_along(vec) tun. Es wird das Gleiche ohne b Variable tun.

CheckForMersennePrimes <- function(x){ 
    vec <- MarsenneNumber(x) 
    a1 <- c() 
    for (i in seq_along(vec)){ 
    if (factorlist(vec[i]) == 1){ 
     a1 <- c(a1, vec[i ]) 
    } 
    } 
    return(a1) 
} 

Weitere den Code Kondensation wird denselben Ausgang geben. Ich entfernte seq_along und Indizierung von vec

CheckForMersennePrimes <- function(x){ 
    vec <- MarsenneNumber(x) 
    a1 <- c() 
    for (i in vec){ 
    if (factorlist(i) == 1) { 
     a1 <- c(a1, i) 
    } 
    } 
    return(a1) 
} 
+0

Danke. Aber wird die Funktion meine neue Variable "vec" in der Zeile "if (factorlist (vec [i])! = 1) {" erkennen, da sie beide auf der gleichen "Ebene" im Code sind? Ich dachte, wenn wir eine neue Variable einführen und sie später verwenden wollen, müssen wir {} verwenden. Vielleicht verstehe ich etwas falsch. Auch ich habe immer noch das gleiche Problem .. – ike

+0

Fehler: keine Funktion, von, zurück zur obersten Ebene zu springen >} Fehler: unerwartete '}' in "}" immer noch mit diesem Problem konfrontiert. – ike

+0

Ich habe meine Frage durch Hinzufügen von Beispielen und 'Primes'-Funktion aktualisiert. Ich benutze Basic R Studio, habe nichts daran geändert und habe nichts heruntergeladen. – ike

Verwandte Themen