| // DISABLE_NATIVE: gcScheduler=AGGRESSIVE |
| |
| import kotlin.test.* |
| |
| fun box(): String { |
| assertEquals(12, add(5, 7)) |
| assertEquals(100000000, add(100000000, 0)) |
| |
| assertEquals(8, fib(6)) |
| |
| assertEquals(1, one(5)) |
| |
| countdown(3) |
| assertEquals(""" |
| 3 ... |
| 2 ... |
| 1 ... |
| ready! |
| """.trimIndent(), sb.toString()) |
| |
| assertEquals(2, listOf(1, 2, 3).indexOf(3)) |
| assertEquals(-1, listOf(1, 2, 3).indexOf(4)) |
| return "OK" |
| } |
| |
| tailrec fun add(x: Int, y: Int): Int = if (x > 0) add(x - 1, y + 1) else y |
| |
| fun fib(n: Int): Int { |
| tailrec fun fibAcc(n: Int, acc: Int): Int = if (n < 2) { |
| n + acc |
| } else { |
| fibAcc(n - 1, fibAcc(n - 2, acc)) |
| } |
| |
| return fibAcc(n, 0) |
| } |
| |
| tailrec fun one(delay: Int, result: Int = delay + 1): Int = if (delay > 0) one(delay - 1) else result |
| |
| val sb = StringBuilder() |
| tailrec fun countdown(iterations: Int): Unit { |
| if (iterations > 0) { |
| sb.appendLine("$iterations ...") |
| countdown(iterations - 1) |
| } else { |
| sb.append("ready!") |
| } |
| } |
| |
| tailrec fun <T> List<T>.indexOf(x: T, startIndex: Int = 0): Int { |
| if (startIndex >= this.size) { |
| return -1 |
| } |
| |
| if (this[startIndex] != x) { |
| return this.indexOf(x, startIndex + 1) |
| } |
| |
| return startIndex |
| |
| } |