Skip to content

Commit 43129f3

Browse files
committed
Eliminated possibilities to perform infinite loops
1 parent f9e56e6 commit 43129f3

File tree

6 files changed

+84
-8
lines changed

6 files changed

+84
-8
lines changed

src/main/scala/scalatutorial/sections/FunctionalLoops.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,10 +137,10 @@ object FunctionalLoops extends ScalaTutorialSection {
137137
*
138138
* Complete the following method definition that computes the factorial of a number:
139139
*/
140-
def factorialExercise(res0: Int, res1: Int, res2: Int): Unit = {
140+
def factorialExercise(res0: Int, res1: Int): Unit = {
141141
def factorial(n: Int): Int =
142142
if (n == res0) res1
143-
else factorial(n - res2) * n
143+
else factorial(n - 1) * n
144144

145145
factorial(3) shouldBe 6
146146
factorial(4) shouldBe 24

src/main/scala/scalatutorial/sections/HigherOrderFunctions.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,9 +161,9 @@ object HigherOrderFunctions extends ScalaTutorialSection {
161161
def sum(f: Int => Int, a: Int, b: Int): Int = {
162162
def loop(x: Int, acc: Int): Int =
163163
if (x > b) acc
164-
else loop(x + res0, acc + f(x))
165-
loop(a, res1)
164+
else loop(x + 1, acc + f(x))
165+
loop(a, res0)
166166
}
167-
sum(x => x, 1, 10) shouldBe 55
167+
sum(x => x, 1, res1) shouldBe 55
168168
}
169169
}

src/main/scala/scalatutorial/sections/TailRecursion.scala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,14 @@ object TailRecursion extends ScalaTutorialSection {
127127
*
128128
* Complete the following definition of a tail-recursive version of `factorial`:
129129
*/
130-
def tailRecFactorial(res0: Int, res1: Int, res2: Int): Unit = {
130+
def tailRecFactorial(res0: Int, res1: Int): Unit = {
131131
def factorial(n: Int): Int = {
132132
@tailrec
133133
def iter(x: Int, result: Int): Int =
134134
if (x == res0) result
135-
else iter(x - res1, result * x)
135+
else iter(x - 1, result * x)
136136

137-
iter(n, res2)
137+
iter(n, res1)
138138
}
139139

140140
factorial(3) shouldBe 6
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* scala-exercises - exercises-scalatutorial
3+
* Copyright (C) 2015-2019 47 Degrees, LLC. <http://www.47deg.com>
4+
*
5+
*/
6+
7+
package scalatutorial.sections
8+
9+
import org.scalacheck.{Arbitrary, Gen}
10+
//import org.scalacheck.ScalacheckShapeless._
11+
import org.scalaexercises.Test
12+
import org.scalatest.refspec.RefSpec
13+
import org.scalatestplus.scalacheck.Checkers
14+
import shapeless._
15+
16+
class FunctionalLoopsSpec extends RefSpec with Checkers {
17+
18+
implicit val arb: Arbitrary[Int :: Int :: HNil] = Arbitrary {
19+
for {
20+
num1 <- Gen.choose(-10, 0)
21+
num2 <- Gen.choose(0, 10)
22+
} yield num1 :: num2 :: HNil
23+
}
24+
25+
def `factorial exercise with recursion`(): Unit =
26+
check(Test.testSuccess(FunctionalLoops.factorialExercise _, 0 :: 1 :: HNil))
27+
28+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* scala-exercises - exercises-scalatutorial
3+
* Copyright (C) 2015-2019 47 Degrees, LLC. <http://www.47deg.com>
4+
*
5+
*/
6+
7+
package scalatutorial.sections
8+
9+
//import org.scalacheck.ScalacheckShapeless._
10+
import org.scalacheck.{Arbitrary, Gen}
11+
import org.scalaexercises.Test
12+
import org.scalatest.refspec.RefSpec
13+
import org.scalatestplus.scalacheck.Checkers
14+
import shapeless.{::, HNil}
15+
16+
class HigherOrderFunctionsSpec extends RefSpec with Checkers {
17+
18+
implicit val arb: Arbitrary[Int :: Int :: HNil] = Arbitrary {
19+
for {
20+
num1 <- Gen.posNum[Int]
21+
num2 <- Gen.posNum[Int]
22+
} yield num1 :: num2 :: HNil
23+
}
24+
25+
def `check tail recursive sum function`(): Unit =
26+
check(Test.testSuccess(HigherOrderFunctions.tailRecSum _, 0 :: 10 :: HNil))
27+
28+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* scala-exercises - exercises-scalatutorial
3+
* Copyright (C) 2015-2019 47 Degrees, LLC. <http://www.47deg.com>
4+
*
5+
*/
6+
7+
package scalatutorial.sections
8+
9+
import org.scalacheck.ScalacheckShapeless._
10+
import org.scalaexercises.Test
11+
import org.scalatest.refspec.RefSpec
12+
import org.scalatestplus.scalacheck.Checkers
13+
import shapeless.HNil
14+
15+
class TailRecursionSpec extends RefSpec with Checkers {
16+
17+
def `factorial exercise tail recursive`(): Unit =
18+
check(Test.testSuccess(TailRecursion.tailRecFactorial _, 0 :: 1 :: HNil))
19+
20+
}

0 commit comments

Comments
 (0)