One possible solution with lambda:
fibp =
lambda do
a = [0, 1]
lambda do |n|
if n > 1
a[n] ||= fibp[n - 2] + fibp[n - 1]
else
n
end
end
end \
.call
p fibp[1000]
Still prone to stack overflow as any recursive method in Ruby.
UPDATE: In fact memoizing is not necessary if all you need is just one result:
fibp =
lambda do
lambda do |n|
if n > 1
p1, p2 = fibp[n - 1]
[p2, p1 + p2]
else
[0, n]
end
end
end \
.call
p fibp[1000].last