在Scala中编写树递归的规范方法是什么?

时间:2017-01-09 10:11:04

标签: scala recursion tree

以下代码示例显示了二进制树示例的一部分,该示例管理“推文”。检查树的每个节点是否适合谓词(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中用于递归的规范方法是什么?特别是将结果传递回递归的最高级别。

由于

1 个答案:

答案 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)))子树。