RosettaCodeData/Task/Ackermann-function/Kotlin/ackermann-function.kotlin

32 lines
782 B
Text
Raw Permalink Normal View History

2015-11-18 06:14:39 +00:00
fun A(m: Long, n: Long): Long = when {
m == 0L -> n + 1
m > 0L -> when {
n == 0L -> A(m - 1, 1)
n > 0L -> A(m - 1, A(m, n - 1))
else -> throw IllegalArgumentException("illegal n")
}
else -> throw IllegalArgumentException("illegal m")
}
fun main(args: Array<String>) {
val M: Long = 4
val N: Long = 20
val r = 0..N
for (m in 0..M) {
2016-12-05 22:15:40 +01:00
print("\nA($m, $r) =")
2015-11-18 06:14:39 +00:00
var able = true
2016-12-05 22:15:40 +01:00
r.forEach {
2015-11-18 06:14:39 +00:00
try {
if (able) {
val a = A(m, it)
print(" %6d".format(a))
} else
2016-12-05 22:15:40 +01:00
print(" ?")
2015-11-18 06:14:39 +00:00
} catch(e: Throwable) {
2016-12-05 22:15:40 +01:00
print(" ?")
2015-11-18 06:14:39 +00:00
able = false
}
}
}
}