Scala:使用堆栈将递归函数转换为迭代函数
下面的代码是将列表拆分为两部分的递归代码Scala:使用堆栈将递归函数转换为迭代函数,scala,recursion,stack,iteration,Scala,Recursion,Stack,Iteration,下面的代码是将列表拆分为两部分的递归代码 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) }
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)
}
我想使用堆栈将此递归函数转换为迭代函数。我已尝试使用堆栈解决此问题 但这只会给代码带来混乱和复杂性 如果你想要一个简单的解决方案,这就是答案
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)
这是一个使用队列的版本
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
的问题是,我们希望在一端添加内容,在另一端删除内容。这不是堆栈,而是队列
所以我认为你应该告诉你的教授,它在队列中更有效:)到目前为止你尝试了什么?它不需要堆栈,如果你说“迭代”,你也允许变量。请更清楚地解释你的实际问题,我在测试中没有堆栈。但是教授给了我更少的分数,坚持我用堆栈来做,而且可以做到。这就是问题中提到的全部。我能理解的队列。但是一个堆栈是后进先出,它根本不适合这个问题。啊,好吧,我明白他的意思了。将第一个元素推到堆栈上。将第二个元素推到另一个堆栈上。如果有第三个元素,则另一个堆栈上的元素位于错误的堆栈中。将其弹出并推到第一个堆栈上。将第三个(第四个,如果存在)元素推到第二个堆栈上,如果有第五个元素,则需要将第三个元素从第二个堆栈移动到第一个。。。。等等但是队列仍然工作得更好…你能发布它的代码吗?显然,我对堆栈不是很满意。你能发布混乱复杂的代码吗?我会尽力弄明白的。