// Запоминание
fun <P, R> ((P)->R).memoize(): (P) -> R {
    val memo: MutableMap<P, R> = HashMap()
    return { memo.getOrPut(it, { this(it) }) }
}
// Пример использования
lateinit var power:(Int)->Int
power={n:Int->if(n==0) 1 else power(n-1)+power(n-1)}
power(27) // 134217728, несколько секунд
power=power.memoize()
power(27) // теперь мгновенно
power(30) // тоже
