【问题标题】:Finding first and last element of the list using recursive使用递归查找列表的第一个和最后一个元素
【发布时间】:2018-08-15 06:34:38
【问题描述】:

我正在尝试在 Scala 中编写递归函数,返回列表(对)的第一个和最后一个元素。我只想使用 .head.tail 而不使用 match 使用简单(非尾)递归(不定义附加函数)。有可能吗?

我可以使用此代码找到的最后一个元素:

def foo(x: List[Int]): (Int) = {
    if (x.tail.isEmpty) (x.head)
    else foo(x.tail)
}

我想返回包含第一个和最后一个元素 (Int, Int) 的对。参数为(x: List[Int])。如果我将head 作为参数传递很容易,但不这样做是否可能?

【问题讨论】:

  • 改用尾递归

标签: algorithm scala list recursion functional-programming


【解决方案1】:

另一种方法

 def headTail(l:List[Int]) : (Int, Int) = {
  if(l.isEmpty) (-1, -1)
  else if(l.tail == List())  (l.head, -1)
  else if(l.tail.tail.isEmpty)  (l.head, l.tail.head)
  else headTail(l.head :: l.tail.tail) //eliminates second element for every iteration
}

【讨论】:

    【解决方案2】:

    您可以对尾部使用内部递归函数,对头部使用外部函数。

    但是 - 这是否仍然符合练习的精神,是另一个问题。

    这是一个非常低效的解决方案:

    def firstAndLast (list: List[Int]): (Int, Int) = {
      if (list.isEmpty) (0, 0) 
      else if (list.size == 1) (list.head, list.head) 
      else if (list.size == 2)
         (list.head, list.tail.head)
      else
        firstAndLast (list.head :: list.tail.tail)
    }
    

    它携带头部不是作为一个单独的参数,而是通过将它重新附加到列表其余部分的头部,如果它长于 2。

    对于空箱有意义的退货,我没有好主意。元组的返回选项通常是一种方式。

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 2019-11-12
      • 2012-06-11
      • 2021-07-12
      • 2023-03-09
      • 2016-08-09
      • 2011-05-31
      • 2019-08-12
      相关资源
      最近更新 更多