乐趣区

scala 系列20190202

今天看到一篇关于 scala 入门基础的提问点,我呢,就在这里简单做一下释疑,纯粹是为了抛砖引玉,特别期待各位同行的不吝赐教
我先来贴一下原帖的提问点:

1、一个数字如果是正数,则它的 signum 为 1;如果是负数,则 signum 为 -1;如果是 0,则 signum 为 0. 编写一个函数来计算这个值
2、一个空的块表达式 {} 的值是什么?类型是什么?
3、指出在 Scala 中何种情况下赋值语句 x=y=1 是合法的。(提示:给 x 找个合适的类型定义)
4、针对下列 Java 循环编写一个 Scala 版 for(int i =10; i >= 0; i–) System.out.println(i);
5、编写一个过程 countdown(n: Int),打印从 n 到 0 的数字
6、编写一个 for 循环,计算字符串中所有字母的 Unicode 代码的乘积。举例来说,“Hello”中所有字符的乘积为 9415087488L
7、同样是解决前一个练习的问题,但这次不使用循环(提示:在 Scaladoc 中查看 StringOps)
8、编写一个函数 product(s: String),计算前面练习中提到的乘积
9、把前一个练习中的函数改成递归函数
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 语句

我们一条一条来看一下:

这第一题我没大明白什么是 signum,所以这个先放下,留给各位同行大神来解答喽,刚好也给我讲讲哦,哈哈哈

首先我们知道,x=y=1 这是肯定不对的,因为它实际上是这样解析的 x=(y=1),而 y=1 是赋值语句,其返回值是 Unit,所以就相当于是将一个 Unit 赋给 x 了, 但是文中又提示给 x 找个合适的类型定义,因此我们只需要将 x 给声明为 var 类型即可 var y = 0; var x = y = 1;

这个嘛就比较简单了 for(i <- 0 to 10) println(i);

首先要说明一下什么是过程,它与函数有什么区别?

在 scala 中对于不返回值的函数有特殊的表示法,如果函数体包含在花括号当中,但是没有前面的 = 号,那么返回类型就是 Unit,这样的函数就被称为过程(procedure),过程不返回值,我们调用它仅仅是为了它的副作用由于过程不返回任何值,所以我们可以省略 = 号所以知道了这一点后,我们再来实现题中的要求
def coutdown(n : Int){
for(i <- (n + 1) until(0,-1)) println(i);
}
注意这里不要写成 for(i <- 0 to 10), 这样并不符合题意
这道题也是有一个陷阱的,就是在声明 s 的时候一定要声明为 Long 型,只要知道这一点后,就比较简单了
def countUnicodeMutiple(str : String) = {
var s : Long = 1;
for(i <- str){
s *= i.toInt;
println(s);
}
}
然后调用即可
后三道题我先放下,公司今天(2019 年 2 月 2 日 16:39:45)走的都没人了,数我离家最远,属我最后一个离开,哎,我也写不下去了,要收拾收拾回家了(好难受,喜欢公司里的一个女的,但是人家特别讨厌我;不说了,明年见)

退出移动版