def sum_factorials(n, cache=[0, 1]): if len(cache) > n: return cache[n] previous = sum_factorials(n - 1) cache.append((previous - sum_factorials(n - 2)) * n + previous) return cache[n] def f(n, i=1, factorial=1, result=1): if i == n: return result next = factorial * (i + 1) return f(n, i + 1, next, result + next) import time start = time.time() result = sum_factorials(980) print(time.time() - start) start = time.time() result2 = f(980) print(time.time() - start)