系列文章目录
前言
这学期开了《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 版权协议,转载请附上原文出处链接和本声明。