Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.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
Scala 如何将组列表中的函数重新构造为简单递归?_Scala_Function_Functional Programming - Fatal编程技术网

Scala 如何将组列表中的函数重新构造为简单递归?

Scala 如何将组列表中的函数重新构造为简单递归?,scala,function,functional-programming,Scala,Function,Functional Programming,我编写了一个函数,它按索引对列表元素进行分组,第一个列表中有奇数索引,第二个列表中有偶数索引。但我不知道如何使用简单的递归实现它,并且不会得到类型不匹配 代码如下: // Simple recursion def group1(list: List[Int]): (List[Int], List[Int]) = list match { case Nil => (Nil, Nil) case head :: Nil => (List(head), Nil) case he

我编写了一个函数,它按索引对列表元素进行分组,第一个列表中有奇数索引,第二个列表中有偶数索引。但我不知道如何使用简单的递归实现它,并且不会得到类型不匹配

代码如下:

// Simple recursion
def group1(list: List[Int]): (List[Int], List[Int]) = list match {
  case Nil => (Nil, Nil)
  case head :: Nil => (List(head), Nil)
  case head :: tail => // how can I make this case?
}

group1(List(2, 6, 7, 9, 0, 4, 1))

// Tail recursion
def group2(list: List[Int]): (List[Int], List[Int]) = {
  def group2Helper(list: List[Int], listA: List[Int], listB: List[Int]): (List[Int], List[Int]) = list match {
    case Nil => (listA.reverse, listB.reverse)
    case head :: Nil => ((head :: listA).reverse, listB.reverse)
    case head :: headNext :: tail => group2Helper(tail, head :: listA, headNext :: listB)
  }
  group2Helper(list, Nil, Nil)
}

group2(List(2, 6, 7, 9, 0, 4, 1))

您必须调用下一个递归,解压缩结果元组,将每个head元素预先挂起到适当的
列表中,然后重新打包新的结果元组

def group1(list: List[Int]) :(List[Int], List[Int]) = list match {
  case Nil                => (Nil, Nil)
  case head :: Nil        => (List(head), Nil)
  case hdA :: hdB :: tail => val (lstA, lstB) = group1(tail)
                             (hdA :: lstA, hdB :: lstB)
}

您必须调用下一个递归,解压缩结果元组,将每个head元素预先挂起到适当的
列表中,然后重新打包新的结果元组

def group1(list: List[Int]) :(List[Int], List[Int]) = list match {
  case Nil                => (Nil, Nil)
  case head :: Nil        => (List(head), Nil)
  case hdA :: hdB :: tail => val (lstA, lstB) = group1(tail)
                             (hdA :: lstA, hdB :: lstB)
}

您尝试了什么导致类型不匹配?不要忘记将
headNext
(如
head::next::tail
)添加到简单递归中,如下所示:well@Bergi如果我尝试像其他函数一样使用如下简单递归来执行此函数:case head::headnext::tail=>(head::group1(List(tail.head)),headnext::group1(tail.tail))它给我不匹配,因为我不能添加头元素到(,),对不起,我不知道它如何调用英语。此函数不正确,这里它的作用是:您不想
group1
使用
tail
.head
.tail
-您只想
group1(tail)
。然后
group1(tail)
将返回两个列表的元组。您需要将
head
前置到第一个,将
headNext
前置到第二个。使用临时变量,这样您只需要调用一次
group1(tail)
,这样您就可以将结果分成两个列表。您尝试了什么导致类型不匹配?不要忘记添加
headNext
(如
head::next::tail
)将简单递归转换为well@Bergi如果我尝试像其他函数一样使用如下简单递归来实现此函数:case head::headnext::tail=>(head::group1(List(tail.head)),headnext::group1(tail.tail)),它会导致不匹配,因为我无法将head元素添加到(u,u),抱歉,我不知道它如何调用英语。此函数不正确,这里它的作用是:您不想
group1
使用
tail
.head
.tail
-您只想
group1(tail)
。然后
group1(tail)
将返回两个列表的元组。您需要将
head
前置到第一个,将
headNext
前置到第二个。使用临时变量,这样您只需要调用
group1(tail)
一次,这样您就可以将结果分成两个列表。谢谢,现在我了解了如何使用变量以防万一。但我不知道它是否仍然是函数式编程?或者此变量不喜欢语句或命令式样式?此
group1()
方法创建7个变量。它们(按顺序)是
列表
头部
hdA
hdB
尾部
lstA
,和
lstB
。它们中的每一个都是
val
(即不可变的),因此它不会与函数式编程的原则相冲突。非常感谢您对Hanks的解释,现在我了解了如何在case中使用变量。但我不知道它是否仍然是函数式编程?或者此变量不喜欢语句或命令式样式?此
group1()
方法创建7个变量。它们(按顺序)是
列表
头部
hdA
hdB
尾部
lstA
,和
lstB
。它们中的每一个都是
val
(即不可变的),因此它不会与函数式编程的原则相冲突。非常感谢您的解释