Scala如何以函数式方式实现迭代累加 避免使用var可变变量
Scala无可变变量的函数式最小耗时实现
改造目标
移除原命令式实现中的var可变变量,全程使用不可变值实现完全等价的计算逻辑:遍历反转字符串时动态计算当前路径耗时,同时记录遍历过程中的全局最小耗时。
核心实现
使用foldLeft折叠操作承载遍历过程中的状态传递,全程不引入任何可变变量,逻辑与原实现完全一致:
def findMinTime(str: String, timeByCar: Int): Int = { str.reverse.foldLeft((timeByCar, timeByCar)) { case ((currentTime, currentMin), c) => val updatedTime = if (c == 'A') currentTime + 3 else currentTime - 2 (updatedTime, math.min(currentMin, updatedTime)) }._2 }
实现说明
- 折叠初始状态传入二元组
(timeByCar, timeByCar),两个值分别对应原实现中myTime、minTime的初始值 - 每遍历一个字符,基于上一步的不可变状态计算新的当前耗时,再通过
math.min得到截止当前位置的最小耗时,全程无值修改操作,所有中间结果都是不可变的val - 遍历完成后取结果元组的第二个元素,即为全流程的最小耗时
- 该实现和原命令式版本逻辑100%对齐,相同输入会得到完全一致的输出,无行为差异,符合函数式编程无副作用、引用透明的要求
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

