scala - 如何在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)
预先感谢您的考虑和回复。
解决方案
如果你在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 。
推荐阅读
- regex - pcre 正则表达式匹配第 n 次出现
- unit-testing - 在 go 测试中模拟嵌入式结构
- r - 从类似数据集中插入缺失的气候数据
- linux - 加载共享库时出错:libsigc-2.0.so 与 libsigc-2.0.so.0
- events - Leaflet.draw - 当圆形或多边形的版本结束时触发事件?
- c# - GetHashCode 的替代方案并在 .Select 中应用
- python - 如何使用常见的 pytest 夹具作为上下文管理器?
- javascript - 如何在电子邮件中发送的消息中创建按钮?
- angular - AngularFireList,属性 valueChanges() 显示错误属性 'query' is missing in type 'Observable<{}[]>
- c# - Azure 存储服务