-- Recursive Style
f = function(a, b)
if a == 0 then
return b + 1
elseif b == 0 then
return f(a - 1, 1)
else
return f(a - 1, f(a, b - 1))
end
end
-- Continuation Passing Style
g = function(a, b, c)
if a == 0 then
return c(b + 1)
elseif b == 0 then
return g(a - 1, 1, c)
else
return g(a, b - 1, function(x)
return g(a - 1, x, c)
end)
end
end
-- Loop Style
h = function(a, b)
local s = {}
while true do
if a == 0 then
if #s ~= 0 then
s[#s](b + 1)
table.remove(s)
else
break
end
elseif b == 0 then
a = a - 1
b = 1
else
b = b - 1
table.insert(s, (function(a_)
return function(x)
a = a_ - 1
b = x
end
end)(a))
end
end
return b + 1
end
print(f(3, 3))
print(g(3, 3, function(x)
return x
end))
print(h(3, 3))
LS0gUmVjdXJzaXZlIFN0eWxlCmYgPSBmdW5jdGlvbihhLCBiKQogIGlmIGEgPT0gMCB0aGVuCiAgICByZXR1cm4gYiArIDEKICBlbHNlaWYgYiA9PSAwIHRoZW4KICAgIHJldHVybiBmKGEgLSAxLCAxKQogIGVsc2UKICAgIHJldHVybiBmKGEgLSAxLCBmKGEsIGIgLSAxKSkKICBlbmQKZW5kCgotLSBDb250aW51YXRpb24gUGFzc2luZyBTdHlsZQpnID0gZnVuY3Rpb24oYSwgYiwgYykKICBpZiBhID09IDAgdGhlbgogICAgcmV0dXJuIGMoYiArIDEpCiAgZWxzZWlmIGIgPT0gMCB0aGVuCiAgICByZXR1cm4gZyhhIC0gMSwgMSwgYykKICBlbHNlCiAgICByZXR1cm4gZyhhLCBiIC0gMSwgZnVuY3Rpb24oeCkKICAgICAgcmV0dXJuIGcoYSAtIDEsIHgsIGMpCiAgICBlbmQpCiAgZW5kCmVuZAoKLS0gTG9vcCBTdHlsZQpoID0gZnVuY3Rpb24oYSwgYikKICBsb2NhbCBzID0ge30KICB3aGlsZSB0cnVlIGRvCiAgICBpZiBhID09IDAgdGhlbgogICAgICBpZiAjcyB+PSAwIHRoZW4KICAgICAgICBzWyNzXShiICsgMSkKICAgICAgICB0YWJsZS5yZW1vdmUocykKICAgICAgZWxzZQogICAgICAgIGJyZWFrCiAgICAgIGVuZAogICAgZWxzZWlmIGIgPT0gMCB0aGVuCiAgICAgIGEgPSBhIC0gMQogICAgICBiID0gMQogICAgZWxzZQogICAgICBiID0gYiAtIDEKICAgICAgdGFibGUuaW5zZXJ0KHMsIChmdW5jdGlvbihhXykKICAgICAgICByZXR1cm4gZnVuY3Rpb24oeCkKICAgICAgICAgIGEgPSBhXyAtIDEKICAgICAgICAgIGIgPSB4CiAgICAgICAgZW5kCiAgICAgIGVuZCkoYSkpCiAgICBlbmQKICBlbmQKICByZXR1cm4gYiArIDEKZW5kCgpwcmludChmKDMsIDMpKQoKcHJpbnQoZygzLCAzLCBmdW5jdGlvbih4KQogIHJldHVybiB4CmVuZCkpCgpwcmludChoKDMsIDMpKQo=