为什么这不能递归?

时间:2011-12-02 05:24:05

标签: algorithm scala data-structures recursion recursive-datastructures

以下是Scala中的一个程序。

def range(low : Int, high : Int) : List[Int] = {
    var result : List[Int] = Nil
    result = rangerec(root, result, low, high)
    result
}

private def rangerec(r : Node, l : List[Int], low : Int, high :Int) : List[Int] = {
      var resultList : List[Int] = List()
      if(r.left != null) {
        rangerec(r.left, resultList, low, high)
      } else if(r.right != null) {
        rangerec(r.right, resultList, low, high)
      } else {
        if(r.key >= low && r.key <= high) {
            resultList = resultList ::: List(r.key)
            resultList
        } 
      }
      resultList
}

我在二叉搜索树中创建了范围方法,实现了有序遍历算法。所以它必须以递归方式工作,但它不会打印任何东西,List()。如何修复我的算法?或编辑我的代码?

2 个答案:

答案 0 :(得分:3)

我不知道scala,但你需要使用list l作为参数传递给递归函数并使用rangerec函数的输出。

private def rangerec(r : Node, l : List[Int], low : Int, high :Int) : List[Int] = {
      var resultList : List[Int] = l
      if(r.left != null) {
        resultList = rangerec(r.left, l, low, high)
      } else if(r.right != null) {
        resultList = rangerec(r.right, l, low, high)
      } else {
        if(r.key >= low && r.key <= high) {
            resultList = l ::: List(r.key)
        } 
      }
      resultList
}

答案 1 :(得分:0)

在函数外部定义你的resultList,因为我看到你将结果附加到这个变量。顺便说一句,顺序遍历遵循此规则。访问左,访问Root,最后访问Right。但是从代码(虽然我不知道scala),我可以破译你正在访问左,右,最后根。

等效的递归有序打印javacode看起来像这样

 public void printOrdered(Node node){
  if(node.left != null){
   printOrdered(node.left); //VISIT LEFT
  }
  System.out.println(node.data); //VISIT ROOT AND PRINT
  if(node.right!=null){
   printOrdered(node.right); //VISIT RIGHT
  }
 }

因此,scala可能看起来像这样(语法可能有误)

private def rangerec(r : Node) : Void = {
      if(r.left != null) {
        rangerec(r.left)
      } 
      resultList = resultList :: List(r.key)
      if(r.right != null) {
        rangerec(r.right)
      }
}

这里resultList是List类型的变量,应该从外部传递。