《快学Scala》第一版第二章练习

  • Post author:
  • Post category:其他


系列文章目录


《快学Scala》第一版第一章练习


《快学Scala》第一版第二章练习


《快学Scala》第一版第三章练习




前言

这学期开了《Spark编程基础》,需要用到Scala语言,书上写的比较简单,本着学一门语言就应该尽量往深处学的想法,到图书馆借了一本《快学Scala》,英文名《Scala for the Impatient》,争取每周看完两章,并将相应练习写成博客。


练习

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

就是数学中的符号函数sgn(x)。

def sgn(x: Int): Int = {
    if(x > 0) 1
    else if(x == 0) 0
        else -1
}

在Scala REPL中运行测试




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

一个空的块表达式{}的值是 () ,类型为Unit

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

x定义为Unit类型

4.针对下列Java循环编写一个Scala版:



for ( int i = 10; i >= 0; i– )  System.out.println( i );

for (i <- 0 to 10 reverse) println(i)

5.编写一个过程

countdown(n: Int)

,打印从

n



0

的数字

过程:函数体包含在花括号当中但没有前面的 = 号,那么返回类型就是Unit。

就是C/C++、Java中不带返回值的函数。

def countdown(n: Int) {
    for(i <- 0 to n reverse){
        println(i)
    }
}

6.编写一个for循环,计算字符串中所有字母的Unicode代码的乘积。举例来说,”Hello”中所有字符的乘积为9415987488L。

需要使用到tolong函数,Scaladoc中的定义为:

def UnicodeMul(str: String): Long = {
    var sum: Long = 1
    for(i <- str) {
         sum *= i.toLong   
    }
    sum
}

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

不使用循环,那就使用递归!

需要使用到charAt()函数

  def UnicodeMul(str: String): Long ={
    var sum: Long = 1;
    if(str.length == 1){
      str.charAt(0).toLong
    }else {
      str.take(1).charAt(0).toLong * UnicodeMul(str.drop(1))
    }
  }

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

其实就是将第6题中的函数名换成product。

def product(s: String): Long = {
    var sum: Long = 1
    for(i <- s) {
         sum *= i.toLong   
    }
    sum
}

9.把前一个练习中的函数改成递归函数。

同样的,将第7题的函数名改成product

  def product(s: String): Long ={
    var sum: Long = 1;
    if(s.length == 1){
      s.charAt(0).toLong
    }else {
      s.take(1).charAt(0).toLong * product(s.drop(1))
    }
  }

10.编写函数计算x^n,其中n是整数,使用如下的递归定义:

  • x^n = y^2,如果n是正偶数的话,这里的y=x^(n/2)。

  • x^n = x * x^(n-1),如果n是正奇数的话。

  • x^0 = 1。

  • x^n = 1 / (x^(-n)),如果n是负数的话。

不得使用return语句。

显而易见,n=0为递归出口

  def power(x: Double,n: Int): Double = {
    if(n == 0){       //如果等于0,递归出口,返回1
      1
    }else{
      if(n < 0){      //如果n为负数,x^n = 1 / (x^(-n))
        1 / power(x, -n)
      }else{
        if(n % 2 == 0){ //如果n为正偶数, x^n = x^(n/2) * x^(n/2)
          power(x, n / 2) * power(x, n / 2)
        }else {         //如果n为正奇数, x^n = x * x^(n-1)
          x * power(x, n-1)
        }
      }
    }
  }



版权声明:本文为lh1298179411原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。