Вот реализация, которая не использует рекурсию и запоминает только последние два значения вместо всей истории последовательности.
nthfib () ниже - прямое решение исходной проблемы (если импорт разрешен)
Это менее элегантно, чем использование методов Reduce, описанных выше, но, хотя и немного отличается от того, что былопри запросе он получает возможность более эффективно использоваться в качестве бесконечного генератора, если нужно также вывести последовательность вплоть до n-го числа (немного переписав, как fibgen () ниже).
from itertools import imap, islice, repeat
nthfib = lambda n: next(islice((lambda x=[0, 1]: imap((lambda x: (lambda setx=x.__setitem__, x0_temp=x[0]: (x[1], setx(0, x[1]), setx(1, x0_temp+x[1]))[0])()), repeat(x)))(), n-1, None))
>>> nthfib(1000)
43466557686937456435688527675040625802564660517371780402481729089536555417949051
89040387984007925516929592259308032263477520968962323987332247116164299644090653
3187938298969649928516003704476137795166849228875L
from itertools import imap, islice, repeat
fibgen = lambda:(lambda x=[0,1]: imap((lambda x: (lambda setx=x.__setitem__, x0_temp=x[0]: (x[1], setx(0, x[1]), setx(1, x0_temp+x[1]))[0])()), repeat(x)))()
>>> list(islice(fibgen(),12))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]