Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/193.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用递归查找列表的第一个和最后一个元素_Algorithm_Scala_List_Recursion_Functional Programming - Fatal编程技术网

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

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])。如果我将头部作为参

我试图在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])
。如果我将
头部作为参数传递,这很容易,但不这样做是否可行?

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

然而,这是否仍然符合演习的精神,是另一个问题

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

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
}

改用尾部递归