1. Конструкция [-1 for _ in range(n)] уже создаёт список. Дальше этот список просто выкидывается и генерируется array.array. Итого в одной строчке сразу генерируются 6 потенциально огромных коллекций. Либо можно переделать на (-1 for _ in range(n)), либо отказаться от array.array, его преимущества здесь сомнительны:
In [3]: a = array("I", range(10000))
In [4]: b = list(range(10000))
In [5]: %timeit sum(a)
206 µs ± 6.03 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
In [6]: %timeit sum(b)
69.3 µs ± 367 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [7]: %timeit a[7777]
49.5 ns ± 0.564 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
In [8]: %timeit b[7777]
33.6 ns ± 0.411 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
2. Убрать рекурсию. Совсем.
3. Удалить typing