Вы пытаетесь реализовать более общий шаблон, известный как Динамическое программирование .
Используемый вами механизм кэширования иногда называется динамическим программированием сверху вниз, так как вы начинаете вычисления с наибольшегоN первый.(Кстати, в вашем главном случае вам нужно всего лишь вызвать C()
для наибольшего N, так как правило для каталонских чисел заставляет его рекурсивно вызывать все остальные значения в любом случае).
Чтобы превратить этот алгоритм в низ-вверх (итеративный подход) вам нужно найти порядок для аргументов таким образом, чтобы C(x)
зависело только от элементов, меньших x
.Вычисляя значения C в этом порядке, вы всегда можете просто использовать значения массива напрямую, вместо того, чтобы полагаться на функцию запоминания:
//initialize your base cases by hand, in
Cval[0] = 1
//Now handle the inductive cases:
for n from 1 up to N:
Cval[n] = 0
for i from 1 to n:
Cval[n] += Cval[i -1] * Cval[n -i];
// i-1 and n-i are both less than n, so we know that
// Cval has already been calculated for them.