From 784a71f968c2f2e9a836976da7a11c6224741614 Mon Sep 17 00:00:00 2001 From: tortolavivo23 Date: Mon, 8 Nov 2021 17:00:18 +0100 Subject: [PATCH] =?UTF-8?q?Dynamic=20Programming=20Signed-off-by:=20Franci?= =?UTF-8?q?sco=20T=C3=B3rtola=20?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scala/DynamicProgramming/Fibonacci.scala | 18 +++++++++++ .../scala/DynamicProgramming/ProblemDP.scala | 31 +++++++++++++++++++ .../DynamicProgramming/FibonacciTest.scala | 16 ++++++++++ 3 files changed, 65 insertions(+) create mode 100644 src/main/scala/DynamicProgramming/Fibonacci.scala create mode 100644 src/main/scala/DynamicProgramming/ProblemDP.scala create mode 100644 src/test/scala/DynamicProgramming/FibonacciTest.scala diff --git a/src/main/scala/DynamicProgramming/Fibonacci.scala b/src/main/scala/DynamicProgramming/Fibonacci.scala new file mode 100644 index 0000000..26d92b3 --- /dev/null +++ b/src/main/scala/DynamicProgramming/Fibonacci.scala @@ -0,0 +1,18 @@ +package DynamicProgramming + +object Fibonacci extends ProblemDP[Int]{ + type S = Int + type F[x] = (x, x) + + def decompose(problem: Int): Either[Int, (Int, Int)] = + problem match { + case x if x<=1 => Left(1) + case x => Right((x-1, x-2)) + } + + def compose(solution: (Int, Int)): Int = { + val (x1, x2) = solution + x1+x2 + } +} + diff --git a/src/main/scala/DynamicProgramming/ProblemDP.scala b/src/main/scala/DynamicProgramming/ProblemDP.scala new file mode 100644 index 0000000..023a29f --- /dev/null +++ b/src/main/scala/DynamicProgramming/ProblemDP.scala @@ -0,0 +1,31 @@ +package DynamicProgramming + +import cats.Functor +import cats.implicits.toFunctorOps + +import scala.collection.immutable.HashMap + +trait ProblemDP[T] { + type S + type F[_] + var map= HashMap[T, S]() + + def decompose(problem: T): Either[S, F[T]] + def compose(solution: F[S]): S + + def apply(problem: T)(implicit F: Functor[F]): S = + map.get(problem) match { + case None => + decompose(problem) match { + case Left(s) => + map+= (problem -> s) + case Right(p)=> + map+= (problem -> compose(p.map(apply))) + } + apply(problem) + case Some(s) => s + } + + + +} diff --git a/src/test/scala/DynamicProgramming/FibonacciTest.scala b/src/test/scala/DynamicProgramming/FibonacciTest.scala new file mode 100644 index 0000000..33a0ecd --- /dev/null +++ b/src/test/scala/DynamicProgramming/FibonacciTest.scala @@ -0,0 +1,16 @@ +package DynamicProgramming + +import org.scalatest.FunSuite +import DynamicProgramming.Fibonacci._ + +class FibonacciTest extends FunSuite { + + test("Fibonacci"){ + assert(apply(0)===1) + assert(apply(1)===1) + assert(apply(3)===3) + assert(apply(4)===5) + assert(apply(10)===89) + } + +}