在 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
,因为公因数不会大于任何数字。
我们需要找出整数列表的所有公因数:
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
,因为公因数不会大于任何数字。