Algorithm 将Catalan递归算法转换为迭代算法

Algorithm 将Catalan递归算法转换为迭代算法,algorithm,complexity-theory,catalan,Algorithm,Complexity Theory,Catalan,大家好,所有强大的黑客、数学家和程序员 我努力为下面的加泰罗尼亚数字方程创建一个递归算法 C(n)=∑ C(i)−1) C(n)−i) (使用斯特林数或其他形式简化该方程不是一种选择。) 以下是目前为止的递归算法: int Cval[1024];//1024 just for example int C( int n ) { if( Cval[n] ) != ­1 ) return Cval[n]; int ans = 0; if( n == 0

大家好,所有强大的黑客、数学家和程序员

我努力为下面的加泰罗尼亚数字方程创建一个递归算法

C(n)=∑ C(i)−1) C(n)−i) (使用斯特林数或其他形式简化该方程不是一种选择。)

以下是目前为止的递归算法:

int Cval[1024];//1024 just for example

int C( int n )
    {
    if( Cval[n] ) != ­1 ) return Cval[n];
        int ans = 0;
        if( n == 0 ) ans = 1;
        for( int i = 1; i <= n; i++ )
            ans += C( i ­- 1 ) * C( n ­- i );
                return Cval[n] = ans;
    }

int main()
{
    for( int i = 0; i < 1024; i++ ) Cval[i] = ­1;
    // call C(n) for any n up to 1023
}
int-Cval[1024]//举个例子
内部C(内部n)
{
如果(Cval[n])!=-1)返回Cval[n];
int ans=0;
如果(n==0)ans=1;

对于(int i=1;i创建一个C数字数组,并构建它。它实际上比递归版本(将多次计算大多数数字)处理更少,占用更少的空间(因为数组位于连续内存中,而不是通过调用堆栈展开)


这还有一个优点,即您可以缓存结果以进行高效处理。

您正在尝试实现一种更通用的模式,称为

您使用的缓存机制有时称为自上而下的动态编程,因为您首先从最大的N开始计算。(顺便说一句,在main中,您只需要为最大的N调用
C()
,因为加泰罗尼亚数字的规则使其递归调用所有其他值)

为了将此算法转变为自底向上(迭代方法),您需要以
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.

为什么不直接使用公式C(n)=(2n选择n)/(n+1)?2n选择n可以迭代计算……或者这是家庭作业?