scala之尾递归_模板

对递归函数编写不是很熟时,无法编写出好性能的递归的。怎么写递归,其实方法就在-“递归”,也要看看你所需的递归函数的是要发挥怎么作用的,例如每次递归时,入参(参与计算作用)是否关联到下一个结果,或者每次递归仅处理参数的一部分(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))))
原谅我使用粗俗的语言来形容,当是为了让别人好理解,不知道会不会事与愿违...



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值