2016-10-30 68 views
-5

以下代碼是將列表拆分爲兩部分的遞歸代碼。Scala:將遞歸函數轉換爲使用堆棧迭代

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

它不需要堆棧,如果當你說「迭代」,你也允許增值。請更清楚地解釋您的實際問題 –

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

我們可以改變first堆棧,在反向

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問題的代價是,我們想要的東西添加到一端,從另一端刪除的東西。這不是一個堆棧,而是一個隊列。

所以我認爲你應該告訴你的教授,它與排隊更好的工作:)