Вы не могли бы хотя бы намекнуть какую часть из вашего конечного решения мне можно просто прилепить к своей?
Ну идея такая, что при вычислении 
a(n) надо проверить не вычислялось ли это раньше.
Для этого создается сперва пустая карта (словарь) 
M куда будут запоминаться ранее вычисленные значения в виде пар 
n,a(n)Создаем карту 
M=map()Проверка вычислялась ли уже 
a(n) делается так.
Внутри функции 
a() определяем переменную 
res -- в неё будем записывать результат.
Проверяем
if(mapisdefined(M,n,&res),return(res)) -- да, вычисляли. Тогда сразу же аозвращаем ранее вычисленное значение
Дальше собсно вычисляем 
a(n), результатом будет наша 
resКогда вычислили, перед возвратом запоминаем результат в карту:
mapput(M,n,res)После чего возвращаем результат вычисления 
a(n).
return(res)Недостаток тут в том, что в функции 
a() используется глобальная переменная 
M. За этим надо следить -- создать её например, обнулить где-то потом и т.п. 
О том как этого избежать, вторая ссылка. Это акттуально для рекурсивных функций, для нерекурсивных вполне можно следить за словарём в стороне.