2017-02-07 7 views
0

studiere ich schnell und ich frage mich, warum Sie folgenden Code:Legendes swift Funktionen

func isNumberDivisible(_ number: Int, by divior: Int) -> Bool { 

    if number % divior == 0 { 
     return true; 
    } else { 
     return false; 
    } 
} 

func isPrime (_ number: Int) -> Bool { 

    var isPrimeNumber = false 

    for index in 0..<number { 

     if (isNumberDivisible(number, by:index)) { 
      isPrimeNumber = false 
     } else { 
      isPrimeNumber = true 
     } 
    } 

    return isPrimeNumber 
} 

isPrime(10) 

Ausgabe ein Fehler - Ausführung unterbrochen wurde, EXC_BAD_INSTRUCTION ..

+1

Weil Sie durch Null teilen? – Hamish

+0

Teilen Sie durch Null? – Andrea

+0

Welche Zeile verursacht das Problem mit welchem ​​Wert? – Larme

Antwort

4

Ihre for loop beginnt mit Null. Das ist ein bedeutungsloser Test, und so wird überprüft, ob Sie mit dem 1.

Sie sollten Ihren Index auf 2

for index in 2..<number { 

beginnen teilen können, und wenn Sie es nicht finden eine Primzahl ist, sollten Sie aufhören - was Diese Funktion gibt aus, ob die Zahl durch (Zahl - 1) teilbar ist oder nicht. Und wie @rmaddy darauf hinweist, müssen Sie nicht jede Nummer überprüfen - in Ihrem Beispiel ist 10 durch 2 und 5 teilbar -, aber Sie müssen nicht 5 überprüfen, weil Sie bereits auf 2

for index in 2..<Int(sqrt(Double(number))) { 

     if (isNumberDivisible(number, by:index)){ 
      isPrimeNumber = false 
      break 
     } else{ 
      isPrimeNumber = true 
     } 
    } 
gescheitert sind
+1

Und es sollte am 'Int (sqrt (number)) 'enden. – rmaddy

+1

Es ist auch irgendwie rückwärts - für eine Non-Prime wird es Schleife mehr als nötig. Die Schleifen/Flags sollten zur Verbesserung der Effizienz umgestaltet werden, wobei gefragt wird, ob 10000 Prime 10000-mal in der aktuellen Schleife und 10000-2 = 9998 mal in der 2 oder 100-fachen Zeit mit @rmagdy-Korrektur beginnt. Wenn richtig markiert, würde es 1 Schleife durchlaufen. – dfd

3
  • Der Rest Operator (%) eine durchführt Teilung
  • Der erste Index ist 0
  • number % divior tut 10/0

Division durch Null verursacht einen Laufzeitfehler.

By the way, die erste Primzahl 2

for index in 2..<number 

und Ihre Algorithmus ohnehin nicht funktionieren.

+0

Funktioniert der Algorithmus nicht, wenn Sie in die erste if eine Pause machen? – GoodSp33d

+0

Nein, der Ansatz ist im Allgemeinen falsch. – vadian

+0

Ja ist es ein Brute-Force-Ansatz .. er lernt immer noch :) – GoodSp33d