17 October, 2008

[Project Euler] Problem 2

Project EulerのProblem 2

Fibonacci数列というと、やはり遅延ストリームで表現するのがお約束ということで、Streamの使い方の復習。
Fibonacci数列と素数列はなんかイディオムとして覚えてもいいかもしれない。それが理解出来ればStreamが自由に扱える様な気がする。

fibはlazy valで宣言しなくてもOKだったが、なぜOKなのかについては自信が無い。

object P002 {
val fib:Stream[Int] = Stream.cons(1, Stream.cons(2, (fib.zip(fib.tail)).map{x => x._1 + x._2}))
def main(args:Array[String]) {
println(fib.take(10)) // --> Stream(1, ?)
println(fib.take(10).force) // --> List(1, 2, 3, 5, 8, 13, 21, 34, 55, 89)
println(fib.filter{x => x%2==0}.takeWhile{x => x<100}.foldLeft(0)(_+_))
println(fib.filter{x => x%2==0}.takeWhile{x => x<4000000}.foldLeft(0)(_+_))
}
}

なんかHaskellで書いたコードに比べると冗長な感じがする。Listと違ってStreamはシンタックスシュガーが弱いから仕方が無いが。

No comments: