C++ 对二项式共效递归函数的误解

c++ misunderstanding of binomial coeficient recursive function

本文关键字:递归函数 误解 二项式 C++      更新时间:2023-10-16

code:

#include<stdio.h>
int binomialCoeff(int n, int k)
{
  // Base Cases
  if (k==0 || k==n)
    return 1;
 else
  return  binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);
}
int main()
{
    int n = 5, k = 2;
    printf("Value of C(%d, %d) is %d ", n, k, binomialCoeff(n, k));
    return 0;
}

我想我可以理解基本情况。当我们使用 0 表示 n 和 k=n 时,结果是 0!/0!即 = 1。所以我们返回 1。公式

但是我无法理解代码的这一部分:

 return  binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);

n 的值为 5,k 的值为 2,我得到的结果为 10。(在公式中替换时).公式但是我们为什么要使用故事呢?

还有一件事。为什么当我从键盘设置"n"和"k"时程序不起作用?喜欢这个:

int main()
{
    int n,k;
    cin>>n;
    cin>>k;
    printf("Value of C(%d, %d) is %d ", n, k, binomialCoeff(n, k));
    return 0;
}

二项式系数的一个特性是:C(n, k) 可以写为 C(n-1,k-1) + C(n-1,k) 对于所有 1 <= k <= n-1。

所以 C(3,2) = C(2,1) + C(2,2) 或 3 = 2 + 1

这是您共享的简单递归示例中使用的内容。

关于你的第二个问题,不知道为什么你应该有任何问题。

但是我们为什么要使用故事呢?

与其说是编程,不如说是数学问题,二项式系数计算有众所周知的递归公式。正是这个公式用在你的程序中。

为什么当我从键盘设置"n"和"k"时程序不起作用

代码看起来是正确的,除了您使用 std::istream 进行输入和 printf 进行输出。究竟什么不起作用?你输入 n>= k 吗?

return binomialCoeff(n-1, k-1) + binomialCoeff(n-1, k);

还记得帕斯卡三角吗?它完全使用这种带有加法的递归公式。

但是,我可以看到您不是在构建这个三角形,而只是在使用递归时递归地尝试一次又一次地计算一些二项式系数。记住已经计算出的结果可能会大大提高您的程序性能。你的第二个问题可能是这种情况:

为什么当我从键盘设置"n"和"k"时程序不起作用。 像这样:

它应该可以工作,但是如果您输入相当大的n并且k,则可能需要很长时间才能完成程序。运行时复杂度为 O(n2)。使用n > 30您可能会注意到执行时间很长。