我有这个迭代函数来计算列表中布尔值的数量。斯卡拉递归计算给定谓词的元素
def countBoolIter[A](test: A=>Boolean, a: List[A]) = {
var count = 0
for(elem <- a){
if(test(elem)) count += 1
}
count
}
传入的第一个参数是isBool
功能:
def isBool(i: Any) = i match {
case _: Boolean => true
case _ => false
}
调用函数如下:
countBoolIter(isBool, List(1, true, 3, true, false, "hi"))
// Output: 3
现在,我试着将它转换成尾递归功能如下:
def countBoolRec[A](test: A=>Boolean, a: List[A], acc: Int = 0): Int = a match {
case Nil => acc
case h :: t if(test(h)) => countBoolRec(test, a, acc+1)
case h :: t => countBoolRec(test, a, acc)
}
但是,我得到一个运行时错误,因为函数不返回任何东西;没有错误抛出。我认为它陷入了一个无限循环,这就是为什么没有返回。
问题:我应该如何解决我尝试的递归实现?
“我应该如何解决我试图递归实现?”这是在调试器中逐步解决的那些问题之一。现在人们不使用调试器吗?然后离开我的草坪。 –