2017-05-30 8 views
0

こんにちは私は、メモ帳でScalaのナップザックソリューションを実装しようとしています。ここでメモ化メモ帳とScalaのナップザックソリューション

ここ
// knapsack = maxWeight: Int, weights: List[Int], values: List[Int] 
val knapsack: ((Int, List[Int], List[Int]) => Int) = Memo { 
    case (0, _, _) | (_, Nil, _) | (_, _, Nil) => 0 
    case (weight, headWt :: tailWts, _ :: tailVals) if headWt > weight => 
             knapsack(weight, tailWts, tailVals) 
    case (weight, headWt :: tailWts, headVal :: tailVals) => math.max(
             headVal+knapsack(weight-headWt, tailWts, tailVals), 
             knapsack(weight-headWt, tailWts, tailVals)) 
} 

println(knapsack(50, weights.sortBy(-_), values.sortBy(-_))) 

のないコードは、メモの定義です:

case class Memo[A,B](f: A=>B) extends mutable.HashMap[A,B]{ 
    override def apply(a: A):B = { 
      getOrElseUpdate(a, f(a)) 
    } 
} 

しかし、私はコンパイル時エラーを取得しています:

Type mismatch, expected: List[Int], actual: List[Any] 

私はメモを削除した場合、それは動作します良い。

ありがとうございました。

答えて

1

私はあなたのエラー

型の不一致、予想取得行れているか分からない。私はknapsackの種類を変更する場合は一覧[任意]

:リスト[INT]、実際に(((Int, List[Int], List[Int])) => Int)、つまりFunction1のタプル(Int, List[Int], List[Int])Intには、Memoのコードがエラーなしでコンパイルされます。

// knapsack = maxWeight: Int, weights: List[Int], values: List[Int] 
val knapsack: (((Int, List[Int], List[Int])) => Int) = Memo { 
    case (0, _, _) | (_, Nil, _) | (_, _, Nil) => 0 
    case (weight, headWt :: tailWts, _ :: tailVals) if headWt > weight => 
    knapsack(weight, tailWts, tailVals) 
    case (weight, headWt :: tailWts, headVal :: tailVals) => math.max(
    headVal + knapsack(weight - headWt, tailWts, tailVals), 
    knapsack(weight - headWt, tailWts, tailVals)) 
} 

val weights: List[Int] = List(10, 20, 30) 
val values: List[Int] = List(2, 3, 4) 
println(knapsack(50, weights.sortBy(-_), values.sortBy(-_))) 

+0

おかげであなたの助けのためにたくさんのSergGrを期待生成します。なぜ起こったのか、何の手がかりもありませんでした。そのような難しいことは、コンパイラのエラーメッセージから取得することです。 – aks