【问题标题】: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。
对于空箱有意义的退货,我没有好主意。元组的返回选项通常是一种方式。