読者です 読者をやめる 読者になる 読者になる

Pychef's Diary

I consider myself an engineer, aren't I?

Exercise 2.2 isSortedの解答 | 『Scala関数型デザイン&プログラミング』

Scala

Scala関数型デザイン&プログラミング』のEXERCISE 2.2の自己流の解答です。

自己流

object Exercise {
  def main(args: Array[String]){
    println(isSorted(Array(1,2,3,4,5), (x:Int, y:Int)=>{x<=y})) //メモ1
  }

  def isSorted[A](arr: Array[A], gt:(A, A)=>Boolean): Boolean = {
    @annotation.tailrec
    def loop(n: Int): Boolean = {
      if(arr.length-1==n) true //メモ2
      else if(gt(arr(n), arr(n+1))) loop(n+1) //メモ3
      else false //メモ4
    }
    loop(0)
  }
}

考え方メモ

  1. 比較関数の条件を考える。Array(1,2,3,5,4)はソートされているとはいえない。Array(1,2,3,4,5)Array(1,2,2,3,4)はソートされていると言える。
  2. loopメソッドのtrue停止条件を考える。カウンターの役割を果たすnが、最後の要素arr.length-1に到達できたら各要素はソートされていると言える。
  3. loopメソッドのループを考える。arr(n)arr(n+1)を比較して、1.の考え(gt)を満たしているか判定する。
  4. それ以外は、条件を満たしていないのでfalseと判定。

参考:オフィシャル流

オフィシャルグループのコードとは違います。 きっとgtに渡している比較関数が違うから、違うのでしょう。 どんなgtを渡しているんだろう? github.com

所感

再帰の考え方がいまいちつかめず苦戦。 いかに自分がいままで用意されてきた関数やメソッドで楽をしてきたか実感。 まだまだ修行が足りぬ。