-- The Great Computer Language Shootout -- http://shootout.alioth.debian.org/ -- contributed by Mike Pall local co = coroutine local wrap, yield = co.wrap, co.yield if co.cstacksize then co.cstacksize(1) end -- Use minimum C stack. local function link(n) if n > 1 then local cofunc = wrap(link) cofunc(n-1) yield() repeat yield(cofunc() + 1) until false else repeat yield(1) until false end end local N = tonumber(arg and arg[1]) or 10 local cofunc = wrap(link) cofunc(500) local count = 0 for i = 1,N do count = count + cofunc() end io.write(count, "\n")