Scala非尾递归解决方案

时间:2017-10-06 20:17:07

标签: scala recursion

我有这个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中尾部递归解决方案更好。

1 个答案:

答案 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
}