Я не думаю, что вы записываете правильную вещь в свой кеш, отображение изменилось, когда вы вызываете его с другими аргументами.
Я думаю, вам нужен кеш (base, exp) -> pow (base, exp).
Я понимаю, для чего ctr
, и почему записывается только половина того, что вы ожидаете.
Рассмотрим calc_tailrec_mem(2,4)
: Первый уровень, pow (2,1) записывается как 2, следующий уровень = calc_tailrec_mem(2,3,...)
, и pow (2,2) записывается. Следующий уровень - calc_tailrec_mem(2,2,...)
, но он уже сохранен в кэше, поэтому рекурсия останавливается.
Функция очень запутанная, потому что она кэширует что-то совершенно отличное от того, что она должна вычислять, из-за накопителя и ctr
.