2014年11月23日日曜日

scalaスケーラブルプログラミング

関数型のプログラミングということで、Haskellの本を読んだついでに
scalaの本も読んでみた。機能豊富で、なかなか本を読むのも大変。。

10章で2Dレイアウトライブラリーなるものを構成し、最後に
P.203で、螺旋模様をつくるプログラムがでていた。
何の説明もないので、最初は見ても良く分からなかったが
ネットでの説明なども参考にしながら何とか解決。

import Element.elem
object Spiral {
  val space = elem(" ")
  val corner = elem("+")
  def spiral(nEdges:Int, direction: Int):Element = {
    if(nEdges == 1) elem("+")
    else{
      val sp = spiral(nEdges -1, (direction + 3) % 4)
      def verticalBar = elem('|', 1, sp.height)
      def horizontalBar = elem('-', sp.width, 1)

      if(direction == 0)
        (corner beside horizontalBar) above (sp beside space)
      else if(direction == 1)
        (sp above space) beside (corner above verticalBar)
      else if(direction == 2)
        (space beside sp) above (horizontalBar beside corner)
      else
        (verticalBar above corner) beside (space above sp)
    }
  }
  def main(args:Array[String]) {
    val nSides = args(0).toInt
    println(spiral(nSides, 0))
  }
}
 (direction + 3) % 4のところで、directionは最初0でその後、3,2,1,0,,,を繰り返すことで
上辺、左辺、下辺、右辺をつなげていく動作をしているようだ。
spの中身は再帰的になっているので、spの中に内側の螺旋があり、その中にまた内側の螺旋があり、、を繰り返すということになるようです。

0 件のコメント:

コメントを投稿