0

다음은 스칼라의 프로그램입니다.이것은 왜 재귀 적으로 작동하지 않습니까?

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 
} 

내 2 진 검색 트리에서 범위 순회 법을 사용하여 순서 순회 알고리즘을 구현했습니다. 그래서 재귀 적으로 작동해야하지만, 아무 것도 출력하지 않습니다. List(). 내 알고리즘을 수정하는 방법? 또는 내 코드를 편집 할 수 있습니까?

답변

3

스칼라에 대해 잘 모르지만, 목록으로 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 
} 
0

결과 변수를이 변수에 추가하면 함수 밖에서 resultList를 정의하십시오. 그런데, 순회는이 규칙을 따른다. 왼쪽 방문, 루트 방문, 오른쪽 방문. 그러나 코드 (비록 내가 스칼라를 모르지만)에서, 나는 당신이 왼쪽, 오른쪽 그리고 마지막으로 루트를 방문하고 있음을 해독 할 수있다.

해당하는 재귀가에 차 인쇄 javacode는 (구문이 잘못 될 수 있음) 다음은

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가 변수입니다 그래서, 스칼라는 다음과 같이 수도

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

처럼 보였다 것 외부에서 전달되어야하는 List 유형의.

관련 문제