首页 > 解决方案 > 如何在Scala中创建一个总和为最大值的半同质整数的迭代?

问题描述

在斯卡拉; 给定最大和值和最大元素值,如何Iterable创建元素中的元素以使元素加起来达到最大和? Iterable 应该具有尽可能小的尺寸。

例如,给定

val maxSum = 47

val maxElementValue = 10

如何创建以下Iterable:

Iterable(10, 10, 10, 10, 7) //sum to 47

其他示例:

val maxSum = 9
val maxElementValue = 10
Iterable(9)

val maxSum = 11
val maxElementValue = 5
Iterable(5, 5, 1)

预先感谢您的考虑和回复。

标签: scala

解决方案


如果你在2.13你可以使用unfold

def elementGenerator(maxSum: Int, maxElementValue: Int): List[Int] =
  Iterator.unfold(maxSum) { remainingSum =>
    if (remainingSum == 0)
      None
    else if (remainingSum <= maxElementValue)
      Some(remainingSum -> 0)
    else
      Some(maxElementValue -> (remainingSum - maxElementValue))
  }.toList

如果您现在不需要保留所有元素但只知道如何生成它们,您也可以考虑只返回Iterator或使用LazyList 。


推荐阅读