blob: 51472386f523236b69c9059819b198e14b3a9f2b [file]
// 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
}