【问题标题】:Scala: Convert Recursive Function to Iterative Using StackScala:使用堆栈将递归函数转换为迭代
【发布时间】:2017-03-12 17:55:39
【问题描述】:

以下代码是将列表拆分为两部分的递归代码。

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

我想使用堆栈将此递归函数转换为迭代函数。

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 它不需要堆栈,如果当你说“迭代”时你也允许变量。请更清楚地解释您的实际问题
  • 我在测试中没有堆栈。但是教授少给我打分,坚持我用堆栈来做,而且可以做到。这就是问题中提到的全部内容。
  • 我能理解的队列。但是堆栈是 LIFO,它根本不适合这个问题。啊,好的,我明白他的意思了。将第一个元素压入堆栈。将第二个元素压入另一个堆栈。如果有第三个元素,则另一个堆栈上的元素在错误的堆栈中。弹出它并将其推入第一个堆栈。将第三个(和第四个,如果存在)元素推入第二个堆栈,如果有第五个元素元素,则需要将第三个元素从第二个堆栈移动到第一个堆栈。 .... 等等。但是队列仍然工作得更好......
  • 你能贴出它的代码吗?显然,我对堆栈不太满意。

标签: scala recursion stack iteration


【解决方案1】:

我尝试使用堆栈解决问题

但它只会给代码带来混乱和复杂

如果您只想要一个简单的解决方案,这就是答案

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)

【讨论】:

  • 你能把混乱复杂的代码贴出来吗?我会试着理解它。
【解决方案2】:

这是一个使用队列的版本。

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 的问题是我们想在一端添加东西并从另一端移除东西。这不是堆栈,而是队列。

所以我认为你应该告诉你的教授,队列效果更好:)

【讨论】:

    猜你喜欢
    • 2018-12-02
    • 1970-01-01
    • 2015-10-26
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2015-05-30
    相关资源
    最近更新 更多