Проблема в том, что список определяется глобально, поэтому после вызова recaman
следующий вызов функции дает неожиданные результаты, поскольку в списке все еще есть элементы:
print(recaman(5)) # 7
print(lst) # [1, 3, 6, 2, 7]
Решение
Существует много возможных решений, но простое, на мой взгляд, элегантное - заставить функцию recaman
принимать список в качестве параметра. Этот список затем может быть передан в рекурсивных вызовах. Изначально вы бы назвали это пустым списком. Таким образом, окончательный код становится:
def recaman(n, lst):
if n == 1:
lst.append(n)
return 1
else:
a = recaman(n-1, lst)
am = a - n
ap = a + n
if am > 0 and am not in lst:
lst.append(am)
return am
else:
lst.append(ap)
return ap
print(recaman(5, [])) # 7
print(recaman(6, [])) # 13