速くScalaの練習問題の解答を学びます—第2章は構造と関数を制御します

4248 ワード

3 制御構造と関数
3.1 1つの数字が正数であればsignumは1である.負数の場合signumは-1です.0の場合signumは0.この値を計算するために関数を記述する
簡単な論理判断
def signum(num:Int){if(num>0)print(1)else if(num<0)print(-1)else print(0)}

Scalaにはすでにこの方法がありますが、さっきAPIを探していたとき、見られるはずです.
BigInt(10).signum

3.2 空の高速表現{}の値は何ですか?タイプは何ですか.
REPLでわかるようになりました
scala> val t = {}
t: Unit = ()

値は()タイプがUnitであることがわかります
3.3 Scalaでどのような場合に付与文x=y=1が正当であるかを示す.(ヒント:xに適切なタイプ定義を探します)
テーマはすでに明確なヒントを与えた.この章では既に述べたように,scalaにおける付与文はUnitタイプである.だからxがUnitタイプであればいいのです.
scala> var y=4;
y: Int = 4

scala> var x={}
x: Unit = ()

scala> x=y=7
x: Unit = ()

これはまた{}がUnitタイプであることを証明した.
3.4 次のJavaループについてScalaバージョンを記述します.for(int i=10;i>=0;i-)System.out.println(i);
Scalaバージョンで書き直せばOKです
for(i <- 0 to 10 reverse)print(i)

3.5 プロセスcountdown(n:Int)を作成し、nから0までの数字を印刷します.
これは上の循環を過程に包装するだけです.やはり書き方を変えましょう.
def countdown(n:Int){
    0 to n reverse foreach print
}

3.6 forループを作成し、文字列内のすべてのアルファベットのUnicodeコードの積を計算します.たとえば、「Hello」のすべての文字列の積は9415087488 Lです.
scala> var t:Long = 1
t: Long = 1

scala> for(i <- "Hello"){
     | t = t * i.toLong
     | }

scala> t
res57: Long = 9415087488

3.7 同じように前の練習の問題を解決しますが、今回はループは使いません.(ヒント:StringOpsをScaladocで表示)
scala> var t:Long = 1
t: Long = 1

scala> "Hello".foreach(t *= _.toLong)

scala> t
res59: Long = 9415087488

3.8 関数product(s:String)を作成し、前の練習で述べた積を計算します.
def product(s:String):Long={
    var t:Long = 1
    for(i <- s){
        t *= i.toLong
    }
    t
}

3.9 前の練習の関数を再帰関数に変更する
前章のtakeとdropに合わせて実現
def product(s:String):Long={
    if(s.length == 1) return s.charAt(0).toLong
    else s.take(1).charAt(0).toLong * product(s.drop(1))
}

3.10 記述関数はxnを計算し、ここでnは整数であり、以下の再帰定義を使用する.
  • xn=y 2,nが正偶数であればここでのy=x(n/2)
  • xn = x*x(n-1)、nが正奇数であれば
  • x0 = 1
  • xn = 1/x(-n)、nが負数であれば
  • return文は使用できません
    def mi(x:Double,n:Int):Double={
        if(n == 0) 1
        else if (n > 0 && n%2 == 0) mi(x,n/2) * mi(x,n/2)
        else if(n>0 && n%2 == 1) x * mi(x,n-1)
        else 1/mi(x,-n)
    }
    Blog URL:http://www.ivanpig.com/blog/?p=456