// version 1.1.2 typealias Func = (T) -> R class RecursiveFunc(val p: (RecursiveFunc) -> Func) fun y(f: (Func) -> Func): Func { val rec = RecursiveFunc { r -> f { r.p(r)(it) } } return rec.p(rec) } fun fac(f: Func) = { x: Int -> if (x <= 1) 1 else x * f(x - 1) } fun fib(f: Func) = { x: Int -> if (x <= 2) 1 else f(x - 1) + f(x - 2) } fun main(args: Array) { print("Factorial(1..10) : ") for (i in 1..10) print("${y(::fac)(i)} ") print("\nFibonacci(1..10) : ") for (i in 1..10) print("${y(::fib)(i)} ") println() }