今天看到一篇关于 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)走的都没人了,数我离家最远,属我最后一个离开,哎,我也写不下去了,要收拾收拾回家了(好难受,喜欢公司里的一个女的,但是人家特别讨厌我;不说了,明年见)
声明
原创手敲不易,转载请注明出处,谢谢。我是拉丁小毛,欢迎大家关注我哦,一起交流,共同进步。有问题可以邮我哦(util.you.com@gmail.com)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。