以下代码示例显示了二进制树示例的一部分,该示例管理“推文”。检查树的每个节点是否适合谓词(p)。如果推文适合谓词,那么它将被累积(acc)到新的树集。另一方面,如果p = false,它将简单地转到下一个节点。
def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
var result = acc
if(p(elem)){
result = right.filterAcc(p, result incl elem)
result = left.filterAcc(p, result incl elem)
}else {
result = right.filterAcc(p, result)
result = left.filterAcc(p, result)
}
result
}
程序调用如下,而p是传递函数:
filterAcc(p, new Empty)
我的问题是,Scala中用于递归的规范方法是什么?特别是将结果传递回递归的最高级别。
由于
答案 0 :(得分:0)
据我记得Coursera课程中这些课程的界面,假设你实际上是recursion
(不是regression
),它应该是这样的:
def filterAcc(p: Tweet => Boolean, acc: TweetSet): TweetSet = {
val updatedAcc = if(p(elem)) acc.incl(elem) else acc // visit current node
left.filterAcc(p, right.filterAcc(p, updatedAcc)) // continue tree traversal
}
正如您在此代码中明确看到的,主要目的是使用修改后的参数调用相同的函数。如果我们遇到满足acc
的推文,我们会根据事实更改p
参数。之后我们必须迭代到right
子树(right.filterAcc(p, updatedAcc)
),得到迭代的结果(将其传递给下一个迭代),迭代到左边(left.filterAcc(p, right.filterAcc(p, acc))
)子树。