【发布时间】:2021-01-07 09:37:51
【问题描述】:
在这里,我试图实现以下目标:
-
使用递归,返回一个新列表,该列表由列表 l 的所有元素组成,当对它们调用函数 f 时返回 true。
-
返回的列表元素必须保持与原始列表相同的顺序。
编辑:
到目前为止,我已经能够消除类型不匹配错误。我在给定定义的情况下遍历列表并返回新列表的目标似乎还很遥远。
sealed trait NumList
case object Nil extends NumList
case class Cons(n: Int, l: NumList) extends NumList
def filterNumList(l: NumList, f: Int => Boolean): NumList = {
l match {
case Nil => Nil
case Cons(i, Nil) => Cons(i, Nil)
case Cons(i, Cons(j, Nil)) if f(i) == false => filterNumList(Cons(j, Nil),f)
case Cons(i, Cons(j, Nil)) if f(i) == true => filterNumList(Cons(i, Nil),f)
case Cons(i, rest) if f(i) == true => filterNumList(Cons(i,rest),f)
case Cons(i, Cons(j, rest)) if f(i) == false => filterNumList(Cons(j, rest),f)
}
}
val l1 = Cons(12, Cons(25, Cons(37, Nil)))
def f1(j: Int): Boolean = j <= 25 && j >= 12
println(filterNumList(l1, f1))
【问题讨论】:
-
您的代码无法编译。您应该首先修复编译错误。
-
e未定义,f == true和f == false没有意义。 -
@DmytroMitin 我已经更正了 e。如果函数 f 返回 true,我想将该元素放入新列表并继续测试列表的其余部分。我不确定逻辑在哪里不正确。
-
f == true和f == false仍然没有意义。f是一个函数,你不应该将它与布尔值进行比较。 -
@DmytroMitin 我明白了,我认为这是正确的,因为返回值是从生成布尔值的测试用例派生的布尔值。哦!我应该加了参数i吧?
标签: scala recursion filter pattern-matching