2
def combinations(occurrences: List[(Char,Int)]): List[List[(Char,Int)]] = occurrences match {
  case Nil => Nil
  case x :: xs => for(z <- combinations(xs); y <- occ(x)) yield (y :: z)
}

def occ(e: (Char, Int)): List[(Char, Int)] = (for(i <- 0 to e._2) yield (e._1, i)).toList

你好,

我在上面的代码片段中找不到任何缺陷,但它仍然给我 List() 任何输入。

4

3 回答 3

10

好吧,我认为您非常接近答案。最重要的是考虑在 Nil 的情况下正确的返回值是多少。

  def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match {
    case Nil => List(List())
    case x :: xs => 
      for {
        z <- combinations(xs)
        n <- 0 to x._2
      } yield (if (n == 0) z else (x._1, n) :: z)
  }
于 2014-06-04T14:15:11.343 回答
2

你是第一个,因为理解总是会Nil在你的递归结束时产生 a ,这将迫使你的其余递归成为Nil。这是一个稍微修改过的版本,虽然它给出了 aList[(Char, Int)]而不是 a List[List[(Char, Int)]]

def combinations(occurrences: List[(Char,Int)]): List[(Char,Int)] = occurrences match {
  case Nil => Nil
  case x :: xs => (for { z <- combinations(xs) } yield z) ::: occ(x)
}

如果你的 for comprehension 的第一部分返回Nil,那么它不会评估其余部分,只会返回Nil。我已经改变了一些东西,所以现在即使它确实评估为Nil,它也会与occ.

于 2013-05-10T20:44:26.250 回答
1
def combinations(occurrences: List[(Char,Int)]): List[List[(Char,Int)]] = occurrences match {
  case Nil => List(List())
  case x :: xs => for(z <- combinations(xs); y <- occ(x)) yield (y :: z)
}

def occ(e: (Char, Int)): List[(Char, Int)] = (for(i <- 0 to e._2) yield (e._1, i)).toList

This has solved my problem!!!

于 2013-05-10T21:18:26.673 回答