使用递归查找列表的第一个和最后一个元素

时间:2018-03-07 08:22:27

标签: algorithm scala list recursion functional-programming

我正在尝试在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作为参数传递是很容易的,但是可以不这样做吗?

2 个答案:

答案 0 :(得分:3)

您可以为尾部使用内部递归函数,并为头部提供外部函数。

然而 - 这仍然是演习的精神,是另一个问题。

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

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。

对于空案件的有意义的回报,我不知道。一般来说,元组的返回选项是一种方式。

答案 1 :(得分:0)

另一种方法

 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
}