《快学Scala》习题详解 第2章 控制结构和函数

来源:互联网 发布:vnc客户端 linux版本 编辑:程序博客网 时间:2024/05/16 09:55

1 如果一个数字为正数,则它的signum为1;如果是负数,则signum为-1;如果是0,则signum是0

   def f(x: Int): Int = {      // 如果f不是递归,可以省略:Int,=会自动进行类型推断      // =用来接收返回值, 不需要返回值时,不用=      // 如果没有=,println()将打印()      if (x > 0) 1      else if (x == 0) 0      else -1    }    println(f(1))    println(f(-1))

2 一个空的块表达式的值是什么?它的类型是什么
表达式的值为(),类型为Unit
Unit等于同Java中的void,只有一个值()
scala中,{ }中最后一个表达式的值的就是块的值

scala> val x = {}x: Unit = ()

3 指出Scala何种情况下赋值语句x=y=1是合法的
在x的类型为Unit的情况下是合法的

scala> var y=1y: Int = 1scala> val x = y = 2x: Unit = ()scala> val x = (y = 2)x: Unit = ()

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

for (i <- (1 to 10).reverse) println(i)//10 to/until 1没反应,to/until只能用来写正序,然后倒转

5 编写一个过程countdown(n:Int),打印从n到0的数字
过程与函数相比,说白了就是没有返回值,不需要使用=

 ef f(n: Int) { for (i <- 1 to n) println(i) }    f(5)

6 编写一个for循环,计算字符串中所有字母的unicode代码的乘积
举例来说,”Hello”中所有字母的字符成为9415087488L
unicode中字母的编码仍然采用的是ascll码

   def f(s: String) {      var sum: Long = 1      for (i <- s) sum *= i      println(sum)    }    f("Hello")

采用 Char中abstract def*(x: Char): Int 方法

7 同样是解决6的问题,但不能够用循环(提示,StringOps)

    def f(s: String) {      var sum: Long = 1      sum = s.map { _.toLong }.product            //defmap[B](f: (A) ⇒ B): String[B],通过函数f将string中的每个元素映射成一个新的集合       // def product: A,对集合中的每个元素相乘      println(sum)    }    f("Hello")

8 编写函数product(s:String),解前面练习
将之前的过程加个=即可,不再赘述

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

    var sum: Long = 1    def f(s: String): String = {      if (s.length() >= 1) {        sum *= s(0)        //每调用一次截取首字符        var s2 = s.drop(1)        f(s2) //递归时,最后一行可以不为String      } else "" //递归需要指定返回值类型     }    f("Hello")    println(sum)

10 编写函数计算x的n次方,其中n是整数,使用如下的递归定义:
感觉翻译的有问题,求x的n次方

    def f(x: Int, n: Int): Double = {      if (n >= 1) {        //先判断n是不是偶数,如果是偶数,变成两个相乘        if (n % 2 == 0) f(x, n / 2) * f(x, n / 2)        //如果是奇数,对n减1,变成偶数,继续判定,直到n=1        else x * f(x, n - 1)      } else if (n == 0) 1      // 如果n为负数,变成正数求解      else 1 / f(x, -n)    }    println(f(10, 2))    println(f(10, -2))
0 0
原创粉丝点击