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

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=1
y: Int = 1

scala> val x = y = 2
x: 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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值