c - 可以用尾递归在C中生成加泰罗尼亚数字吗?

标签 c recursion catalan

我有验证的工作,如果可以通过尾递归计算加泰罗尼亚数字,我可以使用定义通过堆栈递归进行计算,但我不能通过尾递归来完成递归

int catalan(int n){
    if(n==0){
        return 1;
    }
    else{
        return 2*(2*n-1)*Catalan(n-1)/(n+1);
    }
}

最佳答案

指定乘数和除数作为函数的参数,

unsigned long  catalan_tail(unsigned long  n,
                            unsigned long  multiplier,
                            unsigned long  divisor)
{
    /* Optional TODO: Divide multiplier and divisor by
                      their greatest common divisor? */

    if (n < 2)
        return multiplier / divisor;
    else
        return catalan_tail(n - 1, multiplier * 2*(2*n - 1), divisor * (n + 1));
}

和一个包装函数

unsigned long  catalan(unsigned long  n)
{
    return catalan_tail(n, 1, 1);
}

它为额外参数提供初始值。基本上,我们通过提供中间结果作为额外参数来推迟对返回值进行的计算,以便最深的迭代可以完成它。

我们必须将乘数和除数作为单独的值提供,因为仅保证最终迭代的结果为整数。

“可选 TODO”部分并不是加泰罗尼亚数字本身所特有的,但在处理阶乘、乘法和除法时通常是可取的。 greatest common divisor 的二进制方法易于实现且足够快,并且通常有助于将中间值保持在所使用类型的范围内。

一个简单的方法来查明是否 c = a*b溢出,就是检查是否c/a == b (假设正 aa >= 1 )。

关于c - 可以用尾递归在C中生成加泰罗尼亚数字吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53331074/

相关文章:

c - 这个嵌套函数问题可以在 C 中解决吗?

scala - 完美数递归面临的问题

c# - 递归计算文件夹中文件的行数

algorithm - 计算给 bool 表达式加括号的方法

binary-tree - 计算所有结构不同的二叉树的数量的时间复杂度是多少?

c - C 中的 free() 函数对我不起作用

c - 多次调用的函数每次的栈帧是否不同?

algorithm - 括号组合的时间复杂度

c - 何时在程序中首先获取高速缓存行?

c - 链接 c 和程序集