Last active
December 16, 2015 18:39
-
-
Save fupfin/5479615 to your computer and use it in GitHub Desktop.
오일러 프로젝트 문제 2: http://euler.synap.co.kr/prob_detail.php?id=2 피보나치 수열의 각 항은 바로 앞의 항 두 개를 더한 것이 됩니다. 1과 2로 시작하는 경우 이 수열은 아래와 같습니다. 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... 짝수이면서 4백만 이하인 모든 항을 더하면 얼마가 됩니까?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.fupfin.euler.problem2 | |
import scala.collection.immutable.Stream._ | |
import scala.collection.GenIterable | |
object Problem2 { | |
def fib(max: Int): Stream[Int] = 1 #:: 2 #:: fib(1, 2, max) | |
private def fib(v1:Int, v2:Int, max:Int): Stream[Int] = if(v1 + v2 <= max) (v1 + v2) #:: fib(v2, v1 + v2, max) else Empty | |
def sum(that:GenIterable[Int], p: Int => Boolean): Int = { | |
def loop(that: GenIterable[Int], acc: Int): Int = { | |
if(that.isEmpty) acc | |
else loop(that.tail, acc + (if (p(that.head)) that.head else 0)) | |
} | |
loop(that, 0) | |
} | |
def sumOfEvenFibonacciNumbersLessThan4000000 = sum(fib(4000000), _ % 2 == 0) | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.fupfin.euler.problem2 | |
import org.scalatest.FlatSpec | |
import org.junit.runner.RunWith | |
import org.scalatest.junit.JUnitRunner | |
import org.scalatest.matchers.ShouldMatchers | |
@RunWith(classOf[JUnitRunner]) | |
class Problem2Spec extends FlatSpec with ShouldMatchers { | |
import Problem2._ | |
"first 7 fibonacci numbers" should "be 1, 2, 3, 5, 8, 13, 21" in { | |
List(1, 2, 3, 5, 8, 13, 21).zip(fib(30)).forall(v => v._1 == v._2) should equal (true) | |
} | |
"sum of 1, 2, 3, 4, 5" should "be 15" in { | |
sum(List(1, 2, 3, 4, 5), _ => true) should equal (15) | |
} | |
"sum of fibonacci numbers" should "be 19" in { | |
sum(fib(10), _ => true) should equal (19) | |
} | |
"sum of even elements of fibonacci numbers" should "10" in { | |
sum(fib(10), _ % 2 == 0) should equal (10) | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment