Даже если исходное выражение для C(n)
может быть неправильным, фактическое повторение
равно правильно .
Выдалее можно упростить это до
Но это дает вам C(n+1)
в терминах C(n)
.То, что вы хотите, это C(n)
с точки зрения C(n-1)
.Подключите n-1
, чтобы получить
Также обратите внимание, что для того, чтобы целочисленное деление не усекало ваш результат, вам нужно сначала умножить, а затем делить.
int catalan(int n) {
if (n == 1)
return 1;
else
return 2 * (2*n - 1) * catalan(n-1) / (n+1);
}
РЕДАКТИРОВАТЬ: , если значения необходимо использовать часто, а не просто рассчитывать один раз, вероятно, будет хорошей идеей использовать memoization , чтобы избежать вычисленияих более одного раза.
Кроме того, обратите внимание, что из-за большой скорости роста каталонские числа быстро переполняют любой из предопределенных целочисленных типов данных C
.