Du hast auf einem Garagenflohmarkt eine große Kiste voller zufälliger Computerteile gekauft. Jetzt hast du angefangen, die Teile zusammenzusetzen, um eigene Computer zu bauen.
Du willst die Leistung verschiedener Kombinationen von Teilen testen und beschließt, dein eigenes Benchmarking-Programm zu schreiben, um zu sehen, wie deine Computer abschneiden. Du entscheidest dich für den berühmten „Sieve of Eratosthenes“, einen uralten Algorithmus, der deine Computer aber bis an ihre Grenzen treiben dürfte.
Deine Aufgabe ist es, ein Programm zu schreiben, das den Algorithmus des Siebs des Eratosthenes implementiert, um alle Primzahlen kleiner oder gleich einer gegebenen Zahl zu finden.
Eine Primzahl ist eine Zahl größer als 1, die nur durch 1 und sich selbst teilbar ist. Zum Beispiel sind 2, 3, 5, 7, 11 und 13 Primzahlen. Im Gegensatz dazu ist 6 keine Primzahl, denn sie ist nicht nur durch 1 und sich selbst teilbar, sondern auch durch 2 und 3.
Um das Sieb des Eratosthenes zu verwenden, erstellst du zuerst eine Liste mit allen Zahlen zwischen 2 und deiner gegebenen Zahl. Dann wiederholst du die folgenden Schritte:
Du wiederholst diese Schritte so lange, bis du jede Zahl in deiner Liste durchgegangen bist. Am Ende sind alle nicht markierten Zahlen prim.
Die Tests prüfen nicht, ob du den Algorithmus implementiert hast, sondern nur, ob du die richtige Liste der Primzahlen gefunden hast. Um zu prüfen, ob du das Sieb korrekt implementierst, ist ein guter erster Test zu prüfen, ob du keine Division oder Restwertoperationen verwendest.
Sagen wir, du suchst die Primzahlen kleiner oder gleich 10.
Du hast alle Zahlen geprüft und festgestellt, dass 2, 3, 5 und 7 noch unmarkiert sind. Das heißt, sie sind die Primzahlen kleiner oder gleich 10.
Melde dich bei Exercism an, um Scheme mit 39 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.
Wir schauen uns verschiedene Ansätze für das Sieb des Eratosthenes an, beginnend mit verschachtelten Schleifen und Lazy Evaluation, dann mit Mengen und schließlich mit Rekursion.