1. 程式人生 > >Scala控制結構和函式練習

Scala控制結構和函式練習

1、一個數字如果為正數,則它的signum為1;如果是負數,則signum為-1;如果為0,則signum為0.編寫一個函式來計算這個值

object BankDemo {
  def main(args: Array[String]): Unit = {

    println(signum(20))
    println(signum(0))
    println(signum(-2))
  }
  //函式
  def signum(num: Int): Int = {
    if (num > 0) {
      1
    } else if (num < 0) {
      -1
    } else {
      0
    }
  }
}

2、一個空的塊表示式{}的值是什麼?型別是什麼?Unit ()

var t = {}
println(t.isInstanceOf[Unit] + " " + t)

3、針對下列Java迴圈編寫一個Scala版本:

 for(int i=10;i>=0;i–)System.out.println(i);

for (i <- 0 to 10 reverse) {
println(i)
}

4、編寫一個過程countdown(n:Int),列印從n到0的數字

    def countDown(n: Int): Unit = {
        for (i <- 0 to n reverse) {
          println(i)
        }
      }

  def countDown2(n: Int): Unit = {
    //這裡我們使用時第二種方式,使用到高階函式的特性
    (0 to n).reverse.foreach(println)
  }

5、編寫一個for迴圈,計算字串中所有字母的Unicode程式碼(toLong方法)的乘積。舉例來說,"Hello"中所有字串的乘積為9415087488L

   var res: Long = 1
    for (i <- "Hello") { //字串的本質就是字元陣列
      res *= i.toLong
    }
    println("res=" + res)

6、同樣是解決前一個練習的問題,請用StringOps的foreach方式解決。

object Exercise06 {
  def main(args: Array[String]): Unit = {
    //計算字串中所有字母的Unicode程式碼(toLong方法)的乘積。舉例來說,"Hello"中所有字串的乘積為9415087488L,同樣是解決前一個練習的問題,請用StringOps的foreach方式解決
    var res = 1L //res 預設是1
    def f1(c: Char): Unit = {
      //累計
      res *= c.toInt
    }

    //最傳統的寫法
    "Hello".foreach(f1)
    println("res=" + res)

    var res2 = 1L
    //簡化的寫法
    "Hello".foreach((c: Char) => {
      res2 *= c.toInt
    })
    println("res2=" + res2)

    //再簡化一把
    var res3 = 1L
    "Hello".foreach(res3 *= _.toInt)
    println("res3=" + res3)



  }
}

7、編寫一個函式product(s:String),計算字串中所有字母的Unicode程式碼(toLong方法)的乘積

def product(s: String): Long = {
    var r: Long = 1L
    for (i <- s) {
      r *= i.toLong
    }
    r
  }

8、把7練習中的函式改成遞迴函式

object BankDemo {
  def main(args: Array[String]): Unit = {

    println("res=" + product2("Hello"))

    println("Hello".take(1))
    println("Hello".drop(1))

  }

  def product2(s: String): Long = {
    //如果的字串的長度為1, 就直接返回 s.charAt(0).toLong
    if (s.length == 1) return s.charAt(0).toLong
    //s.drop(1) 將s的第一個字元去掉,返回後面所有的。
    else s.charAt(0).toLong * product2(s.drop(1))
  }

}


//程式碼解釋
object Exercise08 {
  def main(args: Array[String]): Unit = {

    val str = "Hello"
    val substr1 = str.take(1)
    println(substr1) // "H"
    var subStr2 = str.drop(1)
    println(subStr2) // "ello"
  }
}