相关疑难解决方法(0)

是否有通用的方法来记忆Scala?

我想记住这个:

def fib(n: Int) = if(n <= 1) 1 else fib(n-1) + fib(n-2)
println(fib(100)) // times out
Run Code Online (Sandbox Code Playgroud)

所以我写了这个,这令人惊讶地编译和工作(我很惊讶,因为fib在其声明中引用自己):

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))
}

val fib: Memo[Int, BigInt] = Memo {
  case 0 => 0
  case 1 => 1
  case n => fib(n-1) + fib(n-2) 
}

println(fib(100))     // prints 100th fibonacci number instantly
Run Code Online (Sandbox Code Playgroud)

但是当我尝试在a中声明fib时def,我得到一个编译器错误:

def foo(n: …
Run Code Online (Sandbox Code Playgroud)

scope scala memoization dynamic-programming forward-reference

48
推荐指数
3
解决办法
2万
查看次数

Scala Memoization:这个Scala备忘录是如何工作的?

以下代码来自Pathikrit的动态编程存储库.我的美丽和独特使我感到困惑.

def subsetSum(s: List[Int], t: Int) = {
  type DP = Memo[(List[Int], Int), (Int, Int), Seq[Seq[Int]]]
  implicit def encode(key: (List[Int], Int)) = (key._1.length, key._2)

  lazy val f: DP = Memo {
    case (Nil, 0) => Seq(Nil)
    case (Nil, _) => Nil
    case (a :: as, x) => (f(as, x - a) map {_ :+ a}) ++ f(as, x)
  }

  f(s, t)
}
Run Code Online (Sandbox Code Playgroud)

该类型Memo在另一个文件中实现:

case class Memo[I <% K, K, O](f: I => O) extends (I => …
Run Code Online (Sandbox Code Playgroud)

scala memoization dynamic-programming

24
推荐指数
1
解决办法
7637
查看次数