Стратегии рекурсии, как правило, подходят сверху вниз, независимо от того, имеют они память или нет.В основе алгоритма лежит динамическое программирование, которое традиционно строится по принципу «снизу вверх».
Я заметил, что вы написали свой код на python, и python, как правило, недоволен глубокой рекурсией (небольшие объемы - это нормально, нопроизводительность быстро падает, и максимальная глубина восстановления равна 1000 - если только она не была изменена с тех пор, как я ее прочитал).
Если мы сделаем версию динамического программирования снизу вверх, мы сможем избавиться от этого восстановления,и мы также можем признать, что нам нужно только постоянное количество места, так как нас действительно интересуют только последние 3 значения:
def stepPerms(n):
if n < 1: return n
memo = [1,2,4]
if n <= 3: return memo[n-1]
for i in range(3,n):
memo[i % 3] = sum(memo)
return memo[n-1]
Обратите внимание, насколько проще логика, если исходить из i, то на один меньшечем значение, так как позиции начинаются с 0 вместо счетчика 1.