Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 4134403

Browse files
Fibonacci algorithm
1 parent 2777031 commit 4134403

File tree

7 files changed

+174
-0
lines changed

7 files changed

+174
-0
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package pl.dmichalski.algorithms.algorithms._10_fibonacci
2+
3+
internal class FibonacciMemoizedService2 {
4+
5+
/**
6+
* O(n) time complexity
7+
*/
8+
fun countFibonacci(n: Int, memo: MutableMap<Int, Long>): Long {
9+
if (n == 0) {
10+
return 0
11+
}
12+
if (memo[n] != null) {
13+
return memo.getValue(n)
14+
}
15+
if (n <= 2) {
16+
return 1
17+
}
18+
val res = countFibonacci(n - 1, memo) + countFibonacci(n - 2, memo)
19+
memo[n] = res
20+
return res
21+
}
22+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package pl.dmichalski.algorithms.algorithms._10_fibonacci
2+
3+
internal class FibonacciRecursionService1 {
4+
5+
/**
6+
* O(2^n) time complexity
7+
*/
8+
fun countFibonacci(n: Int): Long {
9+
if (n == 0) {
10+
return 0
11+
}
12+
if (n <= 2) {
13+
return 1
14+
}
15+
return countFibonacci(n - 1) + countFibonacci(n - 2)
16+
}
17+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package pl.dmichalski.algorithms.algorithms._10_fibonacci
2+
3+
internal class FibonacciTabulatedService3 {
4+
5+
/**
6+
* O(n) time complexity
7+
*/
8+
fun countFibonacci(n: Int): Long {
9+
if (n == 0) {
10+
return 0
11+
}
12+
val fibNumbers = ArrayList<Long>(n)
13+
fibNumbers.addAll(listOf(0, 1, 1))
14+
15+
for (i in 3..n) {
16+
val value = fibNumbers[i - 1] + fibNumbers[i - 2]
17+
fibNumbers.add(value)
18+
}
19+
return fibNumbers[n]
20+
}
21+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package pl.dmichalski.algorithms.algorithms._10_fibonacci
2+
3+
/**
4+
* Write a function which takes n number and returns
5+
* sum from 1 to n inclusive.
6+
*/
7+
object Runner {
8+
9+
@JvmStatic
10+
fun main(args: Array<String>) {
11+
val n = 20
12+
13+
val fibonacciRecursionService1 = FibonacciRecursionService1()
14+
val fibonacciMemoizedService2 = FibonacciMemoizedService2()
15+
val fibonacciTabulatedService3 = FibonacciTabulatedService3()
16+
17+
val result1 = fibonacciRecursionService1.countFibonacci(n)
18+
val result2 = fibonacciMemoizedService2.countFibonacci(n, HashMap(n))
19+
val result3 = fibonacciTabulatedService3.countFibonacci(n)
20+
21+
println("Fibonacci number from $n:")
22+
println("result1 = $result1")
23+
println("result2 = $result2")
24+
println("result3 = $result3")
25+
}
26+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package pl.dmichalski.algorithms.algorithms._10_fibonacci
2+
3+
import spock.lang.Specification
4+
import spock.lang.Unroll
5+
6+
class FibonacciMemoizedService2Spec extends Specification {
7+
8+
private final FibonacciMemoizedService2 underTest = new FibonacciMemoizedService2()
9+
10+
@Unroll
11+
def 'should return (expectedResult=#expectedResult) for (n=#n)'() {
12+
when:
13+
def memo = new HashMap<Integer, Integer>(n)
14+
def result = underTest.countFibonacci(n, memo)
15+
16+
then:
17+
result == expectedResult
18+
19+
where:
20+
n | expectedResult
21+
0 | 0
22+
1 | 1
23+
2 | 1
24+
3 | 2
25+
4 | 3
26+
5 | 5
27+
10 | 55
28+
15 | 610
29+
}
30+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package pl.dmichalski.algorithms.algorithms._10_fibonacci
2+
3+
import spock.lang.Specification
4+
import spock.lang.Unroll
5+
6+
class FibonacciRecursionService1Spec extends Specification {
7+
8+
private final FibonacciRecursionService1 underTest = new FibonacciRecursionService1()
9+
10+
@Unroll
11+
def 'should return (expectedResult=#expectedResult) for (n=#n)'() {
12+
when:
13+
def result = underTest.countFibonacci(n)
14+
15+
then:
16+
result == expectedResult
17+
18+
where:
19+
n | expectedResult
20+
0 | 0
21+
1 | 1
22+
2 | 1
23+
3 | 2
24+
4 | 3
25+
5 | 5
26+
10 | 55
27+
15 | 610
28+
}
29+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package pl.dmichalski.algorithms.algorithms._10_fibonacci
2+
3+
import spock.lang.Specification
4+
import spock.lang.Unroll
5+
6+
class FibonacciTabulatedService3Spec extends Specification {
7+
8+
private final FibonacciTabulatedService3 underTest = new FibonacciTabulatedService3()
9+
10+
@Unroll
11+
def 'should return (expectedResult=#expectedResult) for (n=#n)'() {
12+
when:
13+
def result = underTest.countFibonacci(n)
14+
15+
then:
16+
result == expectedResult
17+
18+
where:
19+
n | expectedResult
20+
0 | 0
21+
1 | 1
22+
2 | 1
23+
3 | 2
24+
4 | 3
25+
5 | 5
26+
10 | 55
27+
15 | 610
28+
}
29+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /