Algorithm 使用递归查找列表的第一个和最后一个元素
我试图在Scala中编写递归函数,返回列表(对)的第一个和最后一个元素。我只想使用Algorithm 使用递归查找列表的第一个和最后一个元素,algorithm,scala,list,recursion,functional-programming,Algorithm,Scala,List,Recursion,Functional Programming,我试图在Scala中编写递归函数,返回列表(对)的第一个和最后一个元素。我只想使用.head和.tail而不使用匹配使用简单(非tail)递归(不定义附加函数)。可能吗 使用此代码可以找到的最后一个元素: def foo(x: List[Int]): (Int) = { if (x.tail.isEmpty) (x.head) else foo(x.tail) } 我想返回包含第一个和最后一个元素的pair(Int,Int)。参数是(x:List[Int])。如果我将头部作为参
.head
和.tail
而不使用匹配
使用简单(非tail)递归(不定义附加函数)。可能吗
使用此代码可以找到的最后一个元素:
def foo(x: List[Int]): (Int) = {
if (x.tail.isEmpty) (x.head)
else foo(x.tail)
}
我想返回包含第一个和最后一个元素的pair
(Int,Int)
。参数是(x:List[Int])
。如果我将头部作为参数传递,这很容易,但不这样做是否可行?您可以对尾部使用内部递归函数,对头部使用外部函数
然而,这是否仍然符合演习的精神,是另一个问题
下面是一个非常低效的解决方案:
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)
}
它不作为单独的参数携带head,而是通过在列表其余部分的开头重新结束它(如果它大于2)
对于空箱子的有意义的回报,我没有什么好主意。元组的返回选项通常是一种方法。另一种方法
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
}
改用尾部递归