2016-10-30 2 views
-5

Der folgende Code ist der rekursive Code zum Aufteilen einer Liste in zwei Teile.Scala: Konvertieren der rekursiven Funktion in Iterativ mit Stack

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

Ich möchte diese rekursive Funktion zu einem iterativen mit einem Stapel konvertieren.

+6

Was hast du bisher versucht? – stefanobaghino

+1

Es braucht keinen Stack, wenn Sie "iterativ" sagen, erlauben Sie auch vars. Bitte erkläre dein Problem genauer –

+0

Ich habe es ohne Stacks im Test gemacht. Aber der Professor hat mich weniger markiert und darauf bestanden, dass ich es mit Stapeln mache und dass es gemacht werden kann. Und das ist alles, was in der Frage erwähnt wird. – user7091463

Antwort

0

Ich habe versucht, das Problem mit Stapel

aber es bringt in dem Code

Falls Sie nur eine einfache Lösung wollen ein Chaos und Komplexität nur zu lösen, ist dies die Antwort

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

Können Sie den chaotischen und komplexen Code trotzdem posten? Ich werde versuchen, einen Sinn daraus zu machen. – user7091463

0

Hier ist eine Version mit Warteschlangen.

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

Wir first auf einen Stapel, auf Kosten eines ist aber das Problem für second

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

Reverse ändern können, dass wir die Dinge zu einem Ende hinzufügen möchten, und entfernen Sie die Dinge aus dem anderen Ende . Dies ist kein Stapel, sondern eine Warteschlange.

Also ich denke, Sie sollten Ihrem Professor sagen, es funktioniert besser mit Warteschlangen :)

Verwandte Themen