在 Scala 中寻找公因数

Finding common factors in Scala

我们需要找出整数列表的所有公因数:

val b = List(4, 8, 12)
b: List[Int] = List(4, 8, 12)

获取列表中的最小值:

val min_b = b.min
min_b: Int = 4

遍历从 1 到 min_b 的范围并检查 b 中的每个元素是否都可以被迭代器的当前值整除,但输出包含空 AnyVals:

val factors_of_b = (1 to min_b)
  .map { x => if (b.forall{ z => z % x == 0 }) x }

结果:

factors_of_b: scala.collection.immutable.IndexedSeq[AnyVal] = Vector(1, 2, (), 4)

产生零来代替不适用的因素并过滤零的结果是一种解决方法,但也许存在更清洁、更像 Scala 的解决方案?

val factors_of_b = (1 to min_b)
  .map { x => if(b.forall{ z => z % x == 0 }) x else 0 }
  .filterNot(_ == 0)

结果:

factors_of_b: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 4)

你要的是filter:

scala> val b = List(4, 8, 12)
b: List[Int] = List(4, 8, 12)

scala> (1 to b.max).filter { x => b.forall{ z => z % x == 0 } }
res3: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 4)

此外,我不确定为什么要迭代到 b.max 而不是 b.min,因为公因数不会大于任何数字。