Berechnung von Primzahlen in Scala: Wie funktioniert dieser Code?
Ich habe Stunden damit verbracht, herauszufinden, wie dieser Code Primzahlen erzeugt.
lazy val ps: Stream[Int] = 2 #:: Stream.from(3).filter(i =>
ps.takeWhile{j => j * j <= i}.forall{ k => i % k > 0});
Ich habe eine Reihe von Druckern usw. verwendet, aber nichts macht es klarer.
Ich denke, dass der Code Folgendes bewirkt:
/**
* [2,3]
*
* takeWhile 2*2 <= 3
* takeWhile 2*2 <= 4 found match
* (4 % [2,3] > 1) return false.
* takeWhile 2*2 <= 5 found match
* (5 % [2,3] > 1) return true
* Add 5 to the list
* takeWhile 2*2 <= 6 found match
* (6 % [2,3,5] > 1) return false
* takeWhile 2*2 <= 7
* (7 % [2,3,5] > 1) return true
* Add 7 to the list
*/
Aber wenn ich mich änderej*j
in der liste soll das 2 * 2 sein das ichangenommen würde genau das gleiche funktionieren, führt dies zu einem Stackoverflow-Fehler.
Ich vermisse hier offensichtlich etwas Grundlegendes und könnte wirklich jemanden gebrauchen, der mir das erklärt, als wäre ich fünf Jahre alt.
Jede Hilfe wäre sehr dankbar.