我有这个tail-recursive函数,如果列表中的任何元素是Boolean
值,则返回true。
def anyBoolTailRec[A](test: A=> Boolean, a: List[A]): Boolean = a match {
case Nil => false
case h :: t if(!test(h)) => anyBoolTailRec(test, t)
case _ => true
}
test参数只是检查值类型的函数:
def isBool(i: Any) = i match {
case _: Boolean => true
case _ => false
}
该函数的调用如下:
anyBoolTailRec(isBool, List(1, 2, "hi", "test", false))
>>> true
问题:如何将此尾递归解决方案转换为非尾递归解?由于我们回归布尔人,我不知道该怎么做。
注意:我知道Scala中尾部递归解决方案更好。
答案 0 :(得分:3)
没有理由这样做。你只是让你的代码变得更糟,没有任何好处,但是......
将尾递归解决方案转换为非尾递归很容易。您可以添加一些不影响结果的操作,以便递归调用不再处于尾部位置。一个总是有效的简单解决方案是在返回之前将递归调用的结果存储在局部变量中。
def anyBoolTailRec[A](test: A=> Boolean, a: List[A]): Boolean = a match {
case Nil => false
case h :: t if(!test(h)) => val foo = anyBoolTailRec(test, t); foo
case _ => true
}