scala - 循环遍历整数列表并减少它们直到数量为零
问题描述
我有这个问题,可以简化为以下内容:
假设我有一个整数列表,如下所示:
List(20,30,40,50,90)
和 x = 100 的值说。
我想遍历该整数列表并从 100 中减去第一个值,然后是第二个值,依此类推,直到 x 达到 0。
所以在这个例子中,我会留下
List(0,0,0,40,90) and x = 0
我通过列表的元素尝试了通常的地图,但问题是 x = 100,我不知道如何在地图中不断更新它以在从中减去列表中的元素后获得它的新减少值.
我确信有一种简单的方法可以做到这一点,但我目前没有看到它。
解决方案
正如评论中所建议的以及使用 foldLeft 的其他答案的替代方法,您可以手工制作自己的尾递归方法:
def compute(xs: List[Int], x: Int): List[Int] = {
def loop(cs: List[Int], ns: List[Int], remainder: Int): List[Int] =
cs match {
case ::(head, next) =>
loop(next, ns :+ math.max(head - remainder, 0), math.max(remainder - head, 0))
case Nil => ns
}
loop(xs, List.empty, x)
}
compute(List(20, 30, 40, 50, 90), 100)
输出:
val res0: List[Int] = List(0, 0, 0, 40, 90)
推荐阅读
- android - JSON Parsing on error body (JSON Exception) org 。json.JSONException:字符 0 处的输入结束
- mongodb - 为什么 MongoDB map-reduce 有隐含的 this
- java - 当 junit3 在类路径上时,Mockito 失败
- javafx-8 - Scenicview 8.7 找不到 JavaFX 应用程序
- python - 自动编码器解码输出
- laravel - Laravel 查询两张表
- ios - 调试 iOS Cordova 应用程序崩溃时如何保持 Safari Web Inspector 保持打开状态?
- r - 从包含标记代码的 r 文件创建 html
- jsp - 如何使用 JSTL 获取 http 响应状态码?
- javascript - angular.js:14800 错误:[ngModel:datefmt] 预期 `2019-12-29` 是日期