您的位置:首页 > 其它

通过Scala面向函数思想,解决高考数学中的压轴数列题

2017-07-24 11:14 344 查看
学习了一段时间的Scala,体会最深的就是其面向函数的风格为我们提供了不同的抽象层次,抽象层次越高,表达问题越简洁,越优雅。当然,Scala中大量的语法糖也让人相当崩溃,这不今天就被一段代码给搞疯了。由于本人有一个恶习:在困了或者脑袋不灵光的时候就会去找一道数学题做,来提神。今天正好找到了2016年北京高考数学理科试题的最后一道数列题目,做为一个数学渣,硬着头皮啃一下这道题吧,结果做着做着就想到了Scala,果然是走火入魔太深了。我们先来看看这道题目吧。



看完这道题目就在想,G时刻就是一个List(-2,2,-1,1,3),对其进行一个操作得到一个新的List,可以用Scala的思想来搞定吧,OK那来试试吧。

这道题目可以这样来看,G时刻就是将一个list a转换成另一个list b,而b中的元素是a中对应元素的下标,这个元素需满足比它前面所有元素都大这一条件。

求下标可以用Scala中的zipWithIndex,我们怎样用函数式的思想来求得满足比前面所有元素都大的元素呢?用for循环嵌套当然很容易得到答案,但我们是面向函数式编程,所以直接摒弃掉FOR循环吧!模式匹配怎么样?

由于list的数据结构是(a::(b::(c::(d::Nil)))),我们只能通过函数得到tail.max,而我们需要从后往前比较,所以我们需要将list进行反向,然后用模式匹配来递归。整个数据流程就是这样了:

List(-2,2,-1,1,3) -zipWithIndex-> List((-2,0),(2,1),(-1,2),(1,3),(3,4))
-reverse-> 反向list -> 模式匹配
思路清晰后开始写代码吧

def funG(ls:List[(Int,Int)]):List[(Int,Int)]={
    if(ls.length==1)Nil
    else {
      ls  match{
        caseh::t => {if(t.map(_._1).max<h._1) List(h):::funG(t) else funG(ls.tail)}
        case
Nil => Nil
      }
    }
  }
  def
getGA(ls:List[Int])={
    val lsPair=ls.zipWithIndex.reverse
    funG(lsPair)
  }
  println(getGA(List(-2,2,-1,1,3)).map(_._2+1).mkString(","))
最后运行结果:
5,2
大功告成。

最后一问当然也可以借助函数的思想来证明,直接上我的答案吧:(字丑





通过这道题,又加深了我对函数式变程的思想印象,在Scala的迷惑中寻找快乐,加油!!!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Scala 高考 数学 函数
相关文章推荐