微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

快学scala课后答案1-2章,自己完成

 

 

第一章 基础

1 在REPL模式下输入 3. 然后按tab键。有哪些方法可以被应用?

答: [root@bigdata01 bin]# sh scala

Welcome to Scala 2.13.0 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_65).

Type in expressions for evaluation. Or try :help.

scala> 3.

!=   <<    abs           getClass        isValidByte    min              toByte        toOctalString  

%    <=    byteValue     intValue        isValidChar    round            tochar        toradians      

&    ==    ceil          isFinite        isValidInt     self             todegrees     toShort        

*    >     compare       isInfinite      isValidLong    shortValue       todouble      unary_+        

+    >=    compareto     isInfinity      isValidShort   sign             toFloat       unary_-         

-    >>    doubleValue   isNaN           isWhole        signum           toHexString   unary_~        

/    >>>   floatValue    isNegInfinity   longValue      to               toInt         until          

<    ^     floor         isPosInfinity   max            toBinaryString   toLong        |               

2 在Scala REPL中,计算3的平方根,然后再对该值求平方。现在,这个结果与3相差多少?(提示:res变量是你的朋友) 

答:scala> math.sqrt(3)

res2: Double = 1.7320508075688772

scala> math.pow(res2,2)

res3: Double = 2.9999999999999996

scala> 3-res3

res4: Double = 4.440892098500626E-16

3 res变量是val还是var? 

 答:res是val的,val是不可变变量,var是可变变量

     scala> math.pow(16,2)

res1: Double = 256.0

scala> res1 = 16

            ^

       error: reassignment to val

4 Scala允许你用数字去乘字符串—去REPL中试一下"crazy"*3。这个操作做什么?在Scaladoc中如何找到这个操作? 

答:scala> "crazy"*3

res2: String = crazycrazycrazy

 

scala> 3*"crazy"

        ^

       error: overloaded method value * with alternatives:

         (x: Double)Double <and>

         (x: Float)Float <and>

         (x: Long)Long <and>

         (x: Int)Int <and>

         (x: Char)Int <and>

         (x: Short)Int <and>

         (x: Byte)Int

        cannot be applied to (String)

     从以上结果看,“crazy”作为字符串,有方法*,如下:

scala> "crazy". (TAB键)

*                     count              isEmpty               reduceOption          tapEach          

+                     diff               isTraversableAgain    reduceRight           to               

……

       这个操作是吧“crazy”这个字符串复制3次并连接输出,Scaladoc中查找StringOps结果见图1-1右侧

 

5 10 max 2的含义是什么?max方法定义在哪个类中? 

答:scala> 10 max 2

res5: Int = 10

根据执行结果可以看出,返回结果为两个数中最大的那个;

max方法存在于RichInt中。10的类型是Int,调 用前首先被转换成RichInt。

scala> 10.max(2)

res7: Int = 10

 

6 用BigInt计算2的1024次方

答:直接调用math会导致数据溢出

scala> math.pow(2,1024)

res8: Double = Infinity

使用BigInt转换,结果如下:

scala> BigInt(2).pow(1024)

res9: scala.math.BigInt = 179769313486231590772930519078902473361797697894230657273430081157732675805500963132708477322407536021120113879871393357658789768814416622492847430639474124377767893424865485276302219601246094119453082952085005768838150682342462881473913110540827237163350510684586298239947245938479716304835356329624224137216

7 为了在使用probablePrime(100,Random)获取随机素数时不在probablePrime和Radom之前使用任何限定符,你需要引入什么?

答: 直接执行如下:

     scala> probablePrime(100,Random)

       ^

       error: not found: value probablePrime

                         ^

       error: not found: value Random

需要导入相关联的包

scala> import scala.math.BigInt._ 

import scala.math.BigInt._

scala> import scala.util.Random 

import scala.util.Random

scala>  

scala> probablePrime(99,Random) 

res14: scala.math.BigInt = 488641816499616907294665725959

8 创建随机文件的方式之一是生成一个随机的BigInt,然后将它转换成三十六进制,输出类似"qsnvbevtomcj38o06kul"这样的字符串。查阅Scaladoc,找到在Scala中实现该逻辑的办法。 

答:通过Scaladoc文档,查找到

 

scala> probablePrime(99,Random) 

res17: scala.math.BigInt = 536562710848253983747999915807

 

scala> res17.toString(36)

res18: String = 1g0qprkfd94f32v2i3a7

9 在Scala中如何获取字符串的首字符和尾字符?

  答:head是获取一个字符,last是获取最后一个,tail是获取一个后剩下的。

scala> val str = "crazy"

str: String = crazy

scala> str.head

res20: Char = c

scala> str.tail

res21: String = razy

scala> str.last

res22: Char = y

10 take,drop,takeRight和dropRight这些字符串函数是做什么用的?和substring相比,他们的优点和缺点都是哪些?

   答: take是从字符串开始,获取字符;

drop是从字符串开始,丢弃字符,输出剩下的;

takeRight是从字符串结尾开始获取字符;

dropRight是从字符串结尾开始丢掉字符后,取剩下的;

scala> val str = "ScalaDoc"

str: String = ScalaDoc

scala> str.take(0)

res23: String = ""

scala> str.take(1)

res24: String = S

scala> str.take(4)

res25: String = Scal

scala> str.drop(4)

res26: String = aDoc

scala> str.takeRight(4)

res27: String = aDoc

scala> str.dropRight(4)

res28: String = Scal   

substring可以取某个区间的字符串,如下:

scala> str.substring(2,5)

res33: String = ala

 

第二章 控制结构和函数

1 如果一个数字为正数,则它的signum为1;如果是负数,则signum为-1;如果是0,则signum是0。编写一个函数来计算这个值。

答:scala> def test(num:Int):Int={

     | if(num>0) 1 else if(num<0) -1 else 0

     | }

test: (num: Int)Int

scala> test(10)

res34: Int = 1

scala> test(-10)

res35: Int = -1

scala> test(0)

res36: Int = 0

2 一个空的块表达式的值是什么?它的类型是什么

  答:值是(),类型是Unit

3 指出Scala何种情况下赋值语句x=y=1是合法的。(提示:给x找个合适的类型定义)

  答:Scala的赋值语句的返回值是Unit,只要x和y是Unit类型,这么 x=y=1就是合法的

4 针对下列java循环编写一个scala版:for(int i=10;i>=0;i--)System.out.println(i)

答:scala>  for(i<-10 to (0,-1)) println(i)

5 编写一个过程countdown(n:Int),打印从n到0的数字。

答 要考虑n大于0和小于0的情况

def countdown(n:Int)={

         if(n>0) for(i<-n to (0,-1)) println(i)

         else for(i<-n to 0) println(i)

}

6 编写一个for循环,计算字符串中所有字母的unicode代码的乘积。举例来说,"Hello"中所有字母的字符成为9415087488L。

答:def calcul(str:String):Long={

           var result:Long = 1

              for(i<-0 to str.length-1) result = str(i).toLong*result

              result

}

scala> calcul("Hello")

res58: BigInt = 9415087488

7 同样是解决一个练习的问题,但这次不使用循环(提示,在Scaladoc中查看StringOps)

答:def calcul (str:String): Long = {

    var result: Long = 1

    result = str.map(_.toLong).product

    result

  }

                    

scala> calcul("Hello")

res0: Long = 9415087488

 

8 编写一个函数product(s: String)函数,计算前面练习中提到的乘积。

答:参见第七题

9 把前一个练习的函数改为递归函数

答:def calcul(str:String):Long={

           if(str.length <0) 0

              else if (str.length  == 1) str.head.toLong

              else (str.head.toLong * calcul(str.tail))

}

scala> calcul("Hello")

res1: Long = 9415087488

 

10 编写函数计算xn

,其中n是整数,使用如下的递归定义:

     ※ xn

=y

* y

,如果n是正偶数的话,这里的y

 = xn∕2

        ※ xn

=x

*xn-1

,如果n是正奇数的话。

     ※ x0

 = 1

        ※ xn=1/x-n

,如果n是负数的话。

不得使用return语句。

答:def calcul(x: Double,n:Int):BigDecimal={

          if(n==0) {1}

          else if(n<0) {1/calcul(x,(-1 * n))}

          else if(n%2==1) {x*calcul(x,n-1)}

          else {calcul(x,n/2)*calcul(x,n/2)}

      }

11 定义一个名为date的字符串插值器,通过这样一个插值器,你可以以date"$year-$month-$day"的形式来定义java.time.localDate。你需要定义一个带有date方法的“隐式”类,就像这样:

implicit class DateInterpolator(val sc:StringContext)extends AnyVal{

       def date(args:Any*):LocalDate=...

}

args(i)是第i个表达式的值。将每个表达式转换成字符串,然后再转换成整数,并传递给LocalDate.of方法。如果你已经会一些Scala,就再加上错误处理逻辑。如果没有三个入参,或者入参不是整数,或者它们不是以破折号隔开的,则抛出异常。(你可以用sc.parts来获取表达式之间的字符串。)

答:  

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐