通过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的迷惑中寻找快乐,加油!!!!!
看完这道题目就在想,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的迷惑中寻找快乐,加油!!!!!
相关文章推荐
- 【面向对象程序设计常见面试题】流运算符为什么不能通过类的成员函数重载?一般怎么解决?(7)
- 高考数学常用数学思想:函数与方程思想,在数列中的应用
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- Java面向对象思想解决猜拳问题
- 练习 4-12 运用 printd 函数的设计思想编写一个递归版本的 itoa 函数,即通过递归 调用把整数转换为字符串
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数 http://reportsoft.blog.hexun.com/75077561_d.html
- PHP 获取当前时间以及解决PHP通过date()函数取得时间错误问题
- OC学习--<猜拳游戏> 之 通过面向对象思想实现
- 通过自执行函数解决,for循环变量泄漏的问题
- 面向 Java 开发人员的 Scala 指南: 面向对象的函数编程
- C 调用数学函数pow时遇到 undefined reference [已解决]
- OC学习--<猜拳游戏> 之 通过面向对象思想实现
- 高等数学:第一章 函数与极限(1)函数 数列极限 函数极限
- JavaScript--------通过闭包解决只能取得包含函数中任何变量最后一个值的问题
- 博弈——通过博弈思想解决的问题(hdu1847,2147)
- java通过javascript引擎调用javascript数学函数实现计算
- 第9节:从spark源码角度分析scala面向对象思想
- 根据输入日期通过位移方式解决包含当月的前几月自定义函数
- JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题