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))