KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
So I've spent hours trying to work out exactly how this code produces prime numbers. lazy val ps: Stream[Int] = 2 #:: Stream.from(3).filter(i => ps.takeWhile{j => j * j <= i}.forall{ k => i % k > 0}); I've used a number of printlns etc, but nothings making it clearer. This is what I think the code does: /** * [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 */ But If I change j*j in the list to be 2*2 which I assumed would work exactly the same, it causes a stackoverflow error. I'm obviously missing something fundamental here, and could really use someone explaining this to me like I was a five year old. Any help would be greatly appreciated.
Tags (comma-separated)
Save Edits
Cancel