【问题标题】:Calculating a catalan number in C在 C 中计算加泰罗尼亚语数
【发布时间】:2021-09-27 21:08:20
【问题描述】:

我正在为 C 中的作业编写一些代码而苦苦挣扎。我必须递归地计算一个加泰罗尼亚数。 给出以下公式: Formula IMG.

遮阳篷应该是:

0 > 1(填0应该打印1)

5 > 42(填5应该打印42)

7 > 429(填7应该打印429)

9 > 4862(填9应该打印4862)

10 > 16796(填10应该打印16796)

请看一下:

#pragma warning(disable : 4996)
#include <stdio.h>

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


int main(void){
    int n;
    printf("Catalan printer\n\n");
    printf("What catalan number do you want to calculate? ");
    scanf("%d", &n);

    /*catalanRecursief(n);*/

    printf("Catalan number: %d > %d", n, catalanRecursief(n));
    
    getchar();
    return(0);
    
}

【问题讨论】:

  • 整数除法会截断小数部分。将公式中的一个数字更改为浮点数。 return (2. * ((2 * n) - 1)) / (n + 1) * (catalanRecursief(n - 1)); 之类的东西(注意前 2 的小数位)
  • 更好的是:在任何除法之前进行所有乘法运算 - return (2 * ((2 * n) - 1)) * (catalanRecursief(n - 1)) / (n + 1)

标签: c recursion catalan


【解决方案1】:

通过将单位从 n 更改为 float 就足以解决它。

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

也可以

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

这是因为除以整数 c 会截断它们

【讨论】:

  • 我绝不会建议在这里使用浮点数。根据wikipedia,加泰罗尼亚数字是一个整数序列。
  • 我明白,但最终的数字绝不是浮点数,它只是暂时的。例如3的情况,计算2.5 * 2 * 1 * 1,结果是5。你总是可以用一个浮点数乘一个整数,结果是整数
  • 如果 int 是 64 位宽,您可能会得到 几乎 正确的大数值,因为 double 只有 48 位尾数。众所周知,使用浮点数进行整数运算会导致许多问题......
  • 那是学校作业。最后,有趣的是警告信息的浮点数限制,但这足以在每种情况下为 OP 获得准确正确的结果。
【解决方案2】:

正如theory 所说,加泰罗尼亚数字是整数,您应该确保除法最后发生以避免整数除法截断:

...
else {
    return (2 * ((2 * n) - 1)) * (catalanRecursief(n - 1)) / (n + 1);
}
...

对于 32 位整数,预计会从 C17 开始溢出,因此如果您想更进一步,请使用 long long...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多