ScalaNote24-模式匹配和高阶函数练习题

网友投稿 887 2022-10-08

ScalaNote24-模式匹配和高阶函数练习题

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小时内删除侵权内容。

上一篇:小程序组件化开发框架
下一篇:FreeMina- 兼容微信小程序Mina框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~