速くScalaの練習問題の解答を学びます—第2章は構造と関数を制御します
3 制御構造と関数
3.1 1つの数字が正数であればsignumは1である.負数の場合signumは-1です.0の場合signumは0.この値を計算するために関数を記述する
簡単な論理判断
Scalaにはすでにこの方法がありますが、さっきAPIを探していたとき、見られるはずです.
3.2 空の高速表現{}の値は何ですか?タイプは何ですか.
REPLでわかるようになりました
値は()タイプがUnitであることがわかります
3.3 Scalaでどのような場合に付与文x=y=1が正当であるかを示す.(ヒント:xに適切なタイプ定義を探します)
テーマはすでに明確なヒントを与えた.この章では既に述べたように,scalaにおける付与文はUnitタイプである.だからxがUnitタイプであればいいのです.
これはまた{}がUnitタイプであることを証明した.
3.4 次のJavaループについてScalaバージョンを記述します.for(int i=10;i>=0;i-)System.out.println(i);
Scalaバージョンで書き直せばOKです
3.5 プロセスcountdown(n:Int)を作成し、nから0までの数字を印刷します.
これは上の循環を過程に包装するだけです.やはり書き方を変えましょう.
3.6 forループを作成し、文字列内のすべてのアルファベットのUnicodeコードの積を計算します.たとえば、「Hello」のすべての文字列の積は9415087488 Lです.
3.7 同じように前の練習の問題を解決しますが、今回はループは使いません.(ヒント:StringOpsをScaladocで表示)
3.8 関数product(s:String)を作成し、前の練習で述べた積を計算します.
3.9 前の練習の関数を再帰関数に変更する
前章のtakeとdropに合わせて実現
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文は使用できません
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は整数であり、以下の再帰定義を使用する.
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