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 语句

我们一条一条来看一下:

  1. 这第一题我没大明白什么是 signum,所以这个先放下,留给各位同行大神来解答喽,刚好也给我讲讲哦,哈哈哈
  2. scala 系列20190202
  3. 首先我们知道,x=y=1 这是肯定不对的,因为它实际上是这样解析的 x=(y=1),而 y=1 是赋值语句,其返回值是 Unit,所以就相当于是将一个 Unit 赋给 x 了,但是文中又提示给 x 找个合适的类型定义,因此我们只需要将 x 给声明为 var 类型即可 var y = 0; var x = y = 1;
  4. 这个嘛就比较简单了 for( i <- 0 to 10 ) println(i);
  5. 首先要说明一下什么是过程,它与函数有什么区别?
在 scala 中对于不返回值的函数有特殊的表示法,如果函数体包含在花括号当中,但是没有前面的 = 号,那么返回类型就是 Unit,这样的函数就被称为过程(procedure),过程不返回值,我们调用它仅仅是为了它的副作用
由于过程不返回任何值,所以我们可以省略 = 号
所以知道了这一点后,我们再来实现题中的要求
def coutdown(n : Int){
    for( i <- (n + 1) until(0,-1)) println(i);
}

注意这里不要写成 for(i <- 0 to 10),这样并不符合题意

  1. 这道题也是有一个陷阱的,就是在声明 s 的时候一定要声明为 Long 型,只要知道这一点后,就比较简单了
def countUnicodeMutiple(str : String) = {
    var s : Long = 1;
    for(i <- str){
      s *= i.toInt;
      println(s);
    }
  }

然后调用即可

后三道题我先放下,公司今天(2019年2月2日 16:39:45)走的都没人了,数我离家最远,属我最后一个离开,哎,我也写不下去了,要收拾收拾回家了(好难受,喜欢公司里的一个女的,但是人家特别讨厌我;不说了,明年见)

相关推荐