2016-10-30 7 views
-5

다음 코드는 목록을 두 부분으로 나누는 재귀 코드입니다.스칼라 : 재귀 함수를 스택을 사용하는 반복으로 변환

def split(lst:List[Int],lst1:List[Int],lst2:List[Int]): (List[Int],List[Int])= 
lst match{ 
    case Nil => (lst1,lst2) 
    case hd::Nil => (lst1,hd::lst2) 
    case hd::tail => split(tail.init,lst1:::List(hd), tail.last::lst2) 
} 

이 재귀 함수를 스택을 사용하여 반복 함수로 변환하려고합니다.

+6

지금까지 무엇을 시도 했습니까? – stefanobaghino

+1

스택이 필요하지 않습니다. "반복"이라고 말하면 vars도 허용됩니다. 실제 문제를 더 명확하게 설명하십시오. –

+0

테스트에서 스택을 사용하지 않았습니다. 그러나 교수님은 저를 덜 표시했고 스택을 사용하여 그것을하고 그것을 할 수 있다고 주장했습니다. 그리고 그것이 그 질문에서 언급 된 전부입니다. – user7091463

답변

0

내가 스택

을 사용하여 문제를 해결하기 위해 노력했습니다하지만 그것은 단지 경우

방금 ​​간단한 솔루션을 원하는 코드의 혼란과 복잡성을 제공,이 대답

def split(lst: List[Int], lst1: List[Int], lst2: List[Int]): (List[Int], List[Int]) = 
(lst1 ::: lst.take(lst.length/2), lst.drop(lst.length /2) ::: lst2) 
입니다
+0

어쨌든 혼돈스럽고 복잡한 코드를 게시 할 수 있습니까? 나는 그것을 이해하려고 노력할 것입니다. – user7091463

0

다음은 대기열을 사용하는 버전입니다.

def iSplit(xs: List[Int]) = { 
    val first = scala.collection.mutable.Queue[Int]() 
    val second = scala.collection.mutable.Queue[Int]() 

    xs.grouped(2).foreach { e => 
     e match { 
     case List(a, b) => 
      second.enqueue(a, b) 
      first.enqueue(second.dequeue) 
     case List(a) => 
      second.enqueue(a) 
     } 
    } 
    (first.toList, second.toList) 
    } 

우리는 역

def iSplit(xs: List[Int]) = { 
    val first = scala.collection.mutable.Stack[Int]() 
    val second = scala.collection.mutable.Queue[Int]() 

    xs.grouped(2).foreach { e => 
    e match { 
     case List(a, b) => 
     second.enqueue(a, b) 
     first.push(second.dequeue) 
     case List(a) => 
     second.enqueue(a) 
    } 
    } 
    (first.toList.reverse, second.toList) 
} 

하지만 second에 대한 문제의 비용으로, 스택에 first을 변경할 수 있습니다 우리가 한 말에 일을 추가하고 다른 쪽 끝에서 사물을 제거 할 것입니다 . 스택이 아니라 대기열입니다.

교수님 께 교수님 께 큐와 더 잘 어울리는 것을 말하면 좋겠다고 생각합니다.