前回チュートリアルサイトを読破しましたので、今回から以下の本を読んでいくことにしました。
最初の方は比較的易しいのでChapter2まで読みました。
練習問題の回答を載せようと思いましたが、それだと芸がないので自分で問題を作って解いてみました。
- Int型の配列を受け取り配列内の要素の最大値を返す関数を定義せよ。関数のシグネチャはdef max(x : Array[Int]) : Intとする。
- 関数fと非負整数nを受け取り、関数f^n(関数fをn回適用する)を返す関数を定義せよ。関数のシグネチャはdef apply[A](f: A => A, n: Int) : A => Aとする。
以下サンプル回答です。
package chapter2 object Problem1 { def max(x : Array[Int]) : Int = { @annotation.tailrec def go(i: Int, acc: Int) : Int = { if (i == x.length) acc else if (acc > x(i)) go(i+1, acc) else go(i+1, x(i)) } go(1, x(0)) } def main(args: Array[String]) : Unit = { println(max(Array(2, 3, 1))) println(max(Array(100))) } }
package chapter2 object Problem2 { def apply[A](f: A => A, n: Int) : A => A = { @annotation.tailrec def go(acc: A => A, m: Int) : A => A = { if (m == 0) x => acc(x) else go(x => f(acc(x)), m-1) } go(x => x, n) } def main(args: Array[String]) : Unit = { val f = apply[Int](_ + 2, 5) val g = apply[Int](_ * 2, 10) println(f(1)) println(g(10)) } }
0 件のコメント:
コメントを投稿