object HammingNumbers { def from(n:Int):Stream[Int] = Stream.cons(n,from(n+1)) def hammings(s:Stream[Int]):Stream[Int] = { def divide(n:Int,b:Int):Int = (n % b == 0) match { case false => n case _ => divide(n/b,b) } Stream.cons(s.head,hammings(s.tail.filter { n => List(2,3,5).foldLeft(n) { (v,b) => divide(v,b) } == 1 })) } def hammings():Stream[Int] = hammings(from(1)) def main(args:Array[String]):Unit = { try { val n:Int = args.length match { case 1 => args(0).toInt case _ => 100 } println(hammings().take(n).mkString("\n")) } catch { case e => e.printStackTrace } } }