Algorithm 将Catalan递归算法转换为迭代算法
大家好,所有强大的黑客、数学家和程序员 我努力为下面的加泰罗尼亚数字方程创建一个递归算法 C(n)=∑ C(i)−1) C(n)−i) (使用斯特林数或其他形式简化该方程不是一种选择。) 以下是目前为止的递归算法: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
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可以迭代计算……或者这是家庭作业?