react 前端框架如何驱动企业数字化转型与创新发展
887
2022-10-08
ScalaNote24-模式匹配和高阶函数练习题
书到用时方恨少,很多函数还是不熟悉啊!!!
Exercise01
利用模式匹配,编写一个swap函数,接受一个整数的对偶,返回对偶的两个组成部件互换位置的新对偶 //对偶貌似就是元组的意思,姑且认为他是元组吧
var tuple = (4,5)println(tuple.getClass)def swap(tuple:Tuple2[Int,Int])={ tuple match{ case (x:Int,y:Int)=>(y,x)}}swap(tuple)
class scala.Tuple2$mcII$sptuple: (Int, Int) = (4,5)swap: (tuple: (Int, Int))(Int, Int)res3: (Int, Int) = (5,4)
Exercise02
利用模式匹配,编写一个swap函数,交换数组中的前两个元素的位置,前提条件是数组长度至少为2
import scala.collection.mutable.ArrayBufferdef swap(arr:Array[Any]):Array[Any]={ arr match{ case Array(x,y,res@_*) => Array(2,1)++res }}println(swap(Array(1,2,3,4,5)).mkString(" "))println(swap(Array("a","b")).mkString(" "))
2 1 3 4 52 1import scala.collection.mutable.ArrayBufferswap: (arr: Array[Any])Array[Any]
Exercise03
编写一个函数,计算List[Option[Int]]中所有非None值之和。不得使用match语句
//getOrElse给了默认值0def sum(lst: List[Option[Int]]) = lst.map(_.getOrElse(0)).sumval x = List(Some(1), None, Some(2), None, Some(3))println(sum(x))
6sum: (lst: List[Option[Int]])Intx: List[Option[Int]] = List(Some(1), None, Some(2), None, Some(3))
Exercise04
编写函数values(fun:(Int)=>Int,low:Int,high:Int),该函数输出一个集合,对应给定区间内给定函数的输入和输出。比如,values(x=>x*x,-5,5)应该产出一个对偶的集合(-5,25),(-4,16),(-3,9),…,(5,25)
def square(x:Int):Int={ x*x}def values(fun:(Int)=>Int,low:Int,high:Int)={ var arr = Array[Any]() for(i <- low to high){ arr = arr ++ Array((i,fun(i))) } arr}values(square,-5,5)
square: (x: Int)Intvalues: (fun: Int => Int, low: Int, high: Int)Array[Any]res121: Array[Any] = Array((-5,25), (-4,16), (-3,9), (-2,4), (-1,1), (0,0), (1,1), (2,4), (3,9), (4,16), (5,25))
Exercise05
如何用reduceLeft得到数组Array(1,333,4,6,4,4,9,32,6,9,0,2)中的最大元素?
val arr = Array(1,333,4,6,4,4,9,32,6,9,0,2)def myMax(x:Int,y:Int)={ if (x>=y) x else y}arr.reduceLeft(myMax)
arr: Array[Int] = Array(1, 333, 4, 6, 4, 4, 9, 32, 6, 9, 0, 2)myMax: (x: Int, y: Int)Intres122: Int = 333
Exercise06
用to和reduceLeft实现阶乘函数,不得使用循环或递归
def myFactorial(n:Int)={ val multiply = (x:Int,y:Int)=>x*y (1 to n).reduceLeft(multiply)}myFactorial(5)
myFactorial: (n: Int)Intres124: Int = 120
Exercise07
编写函数largest(fun:(Int)=>Int,inputs:Seq[Int]),输出在给定输入序列中给定函数的最大值。举例来说,largest(x=>10x-xx,1 to 10)应该返回25.不得使用循环或递归
def largest(fun:(Int)=>Int,inputs:Seq[Int])={ val myMax=(x:Int,y:Int)=>Array(x,y).max inputs.map(fun(_)).reduceLeft(myMax)}largest(x=>10*x-x*x,1 to 10)
largest: (fun: Int => Int, inputs: Seq[Int])Intres130: Int = 25
Exercise08
要得到一个序列的对偶很容易,比如:val pairs = (1 to 10) zip (11 to 20) 编写函数adjustToPair,该函数接受一个类型为(Int,Int)=>Int的函数作为参数,并返回一个等效的, 可以以对偶作为参数的函数。举例来说就是:adjustToPair(*)((6,7))应得到42。然后用这个函数通过map计算出各个对偶的元素之和
def adjustToPair(fun:(Int,Int)=>(Int))={ (x:Tuple2[Int,Int])=>fun(x._1,x._2)}adjustToPair((x:Int,y:Int)=>x*y)((6,7))
adjustToPair: (fun: (Int, Int) => Int)((Int, Int)) => Intres135: Int = 42
val pairs = (1 to 10) zip (11 to 20) pairs.map(adjustToPair((x:Int,y:Int)=>x*y))
pairs: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,11), (2,12), (3,13), (4,14), (5,15), (6,16), (7,17), (8,18), (9,19), (10,20))res136: scala.collection.immutable.IndexedSeq[Int] = Vector(11, 24, 39, 56, 75, 96, 119, 144, 171, 200)
2020-03-19 于南京市区栖霞区
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~