对递归函数编写不是很熟时,无法编写出好性能的递归的。怎么写递归,其实方法就在-“递归”,也要看看你所需的递归函数的是要发挥怎么作用的,例如每次递归时,入参(参与计算作用)是否关联到下一个结果,或者每次递归仅处理参数的一部分(List或Map等),不过刚接触是先按照我下面的“模板”写递归会好理解些,对于下面的懂了,其他情况就不言就会了
package com.org
import scala.annotation.tailrec
/**
* @author Administrator
*/
object DemoTest extends App {
val list:List[Int] = List(1,2,2,3,4,43,23,11,2,6,7,78,9)
//目的-将list内的数据按奇偶分开,
//reault => list2 = List(List(1,3,43,23,11,7,9),List(2,2,4,2,6,78))按照顺序分开
def splitNum(list:List[Int]):List[List[Int]] = {
@tailrec
def spliteHelp(list1:List[Int],list2:List[List[Int]]):List[List[Int]]={
if(list1 == Nil) list2
else list1 match{
case head::tail => head match {
case x:Int if(x % 2==1) => spliteHelp(tail,List((head :: list2(0)),list2(1)))
case y:Int if(y % 2==0) => spliteHelp(tail,List(list2(0),(head :: list2(1))))
}
case x => x(0) match {
case s:Int if(s % 2==1) => spliteHelp(Nil,List((s :: list2(0)),list2(1)))
case z:Int if(z % 2==0) => spliteHelp(Nil,List((z :: list2(0)),list2(1)))
}
}
}
spliteHelp(list,List(List.empty[Int],List.empty[Int]))
}
splitNum(list).map{_.reverse}
}
上面的程序看起来好像很难,但是仔细分析还是好理解的
我们看看这个
递归之框架
object DemoTest extends App {
val list:List[Int] = List(1,2,2,3,4,43,23,11,2,6,7,78,9)
//目的-将list内的数据按奇偶分开,
//reault => list2 = List(List(1,3,43,23,11,7,9),List(2,2,4,2,6,78))按照顺序分开
def splitNum(list:List[Int]):List[List[Int]] = {
@tailrec
def spliteHelp(list1:List[Int],list2:List[List[Int]]):List[List[Int]]={
if(list1 == Nil) list2 //1.跳出尾递归
else list1 match{ //2.模式匹配,分而治之
}
}
spliteHelp(list,List(List.empty[Int],List.empty[Int])) //3.调用递归
}
splitNum(list).map{_.reverse}
}
分而治之
else list1 match{
case head::tail => head match {
case x:Int if(x % 2==1) =>
case y:Int if(y % 2==0) =>
}
case x => x(0) match {
case s:Int if(s % 2==1) =>
case z:Int if(z % 2==0) =>
}
}
进入递归
-----------------?? => spliteHelp(tail,List((head :: list2(0)),list2(1)))
-----------------?? => spliteHelp(tail,List(list2(0),(head :: list2(1))))
原谅我使用粗俗的语言来形容,当是为了让别人好理解,不知道会不会事与愿违...