尝试将memoization引入递归算法。
case class Memo[A,B](f: A => B) extends (A => B) {
private val cache = mutable.Map.empty[A, B]
def apply(x: A) = cache getOrElseUpdate (x, f(x))
}
private val fib: Memo[Int, BigInt] = Memo {
case 0 => 0
case 1 => 1
case n => fib(n-1) + fib(n-2)
}
def foo(n: Int) = {
fib(n)
}
这是否意味着如果我们使用可变状态和功能值(由val定义......几乎是功能值)那么它是不是线程安全的?
(val fib
- 看起来像全局范围的可变变量/对象)
答案 0 :(得分:0)
我会说是的,如果有更多线程同时调用foo
,可能会出现问题。即使我在想,如果你只是添加到地图并且键的值始终相同,则无法保证它必须正常工作。如果Map的getOrElseUpdate
方法的实现无论出于何种原因都是有状态的,那么它就行不通。根据定义,可变Map的合同不是线程安全的。
如果可以,请将同步添加到地图中,您就可以了:
private val cache = new HashMap[A, B] with SynchronizedMap[A, B]