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()。
答案 0 :(得分: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)
}
答案 1 :(得分:2)
您首先理解,在递归结束时总会产生Nil
,这会强制您的其余递归为Nil
。这是一个略有修改的版本,虽然它提供List[(Char, Int)]
而不是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)
}
如果您的理解的第一部分返回Nil
,那么它将不会评估其余部分,只会返回Nil
。我已经改变了一些东西,所以现在即使评估为Nil
,它也会与occ
的结果相结合。
答案 2 :(得分: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
这解决了我的问题!!!