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