C++ CPP-二项式系数-我得到了错误的结果

C++ CPP-二项式系数-我得到了错误的结果,c++,binomial-coefficients,C++,Binomial Coefficients,任务: 编写和测试计算二项系数的C++函数。 给出了二项式系数的三种定义(见下图)。 我个人使用了中间的定义 我的问题: 但问题是,我得到了错误的结果。5比2必须是10,我得到26 为什么不使用二项式系数的其他定义? 因为在另外两个定义中,每个定义都有一个分数,我害怕在C++中做除法运算来获得舍入误差。这就是为什么我选择中间的定义。 我的代码: #include <iostream> int binomial(int a,int b){ if(a < b) re

任务: 编写和测试计算二项系数的C++函数。 给出了二项式系数的三种定义(见下图)。 我个人使用了中间的定义

我的问题: 但问题是,我得到了错误的结果。5比2必须是10,我得到26

为什么不使用二项式系数的其他定义? 因为在另外两个定义中,每个定义都有一个分数,我害怕在C++中做除法运算来获得舍入误差。这就是为什么我选择中间的定义。

我的代码:

    #include <iostream>


int binomial(int a,int b){
  if(a < b) return 0;
  else if(a == b || a == 0 ) return 1;

  return binomial(a-1,b) + binomial(a-1,b-1);
}




int main(){

int n; 
int k;
std::cin >> n;
std::cin >> k;

std::cout << "Binomial of " << n << " and " << k << " equals = " << binomial(n,k) << std::endl;

  return 0;
}
#包括
int二项式(int a,int b){
如果(a>n;
标准:cin>>k;

std::cout你的第二个案例错了吗

int binomial(int a,int b){
  if(a < b) return 0;
  else if(a == b || a == 0 ) return 1;   //  <------------

  return binomial(a-1,b) + binomial(a-1,b-1);
}
请注意,更好的命名可以避免这种错误

PS

为什么不使用二项式系数的其他定义


您的推理对于最后一个定义是正确的,但对于第一个定义是错误的。结果总是一个整数,因此命名和分母总是这样,您可以使用整数算术进行除法。您将遇到一个问题,即为阶乘获取不必要的大项。

您有第二种情况w荣

int binomial(int a,int b){
  if(a < b) return 0;
  else if(a == b || a == 0 ) return 1;   //  <------------

  return binomial(a-1,b) + binomial(a-1,b-1);
}
请注意,更好的命名可以避免这种错误

PS

为什么不使用二项式系数的其他定义


您的推理对于最后一个定义是正确的,但对于第一个定义是不正确的。结果总是一个整数,因此命名符和分母总是这样,您可以使用整数算术进行除法。您将遇到一个问题,即为阶乘获取不必要的大项。

Omg非常感谢!请你发现我在这个特殊的程序中保留了n和k,甚至在函数中也保留了吗?@limonade肯定是的。如果不是大多数的话,很多错误都可以通过正确的命名来避免。好吧,我没有看到二项式系数的第一个定义总是提供一个正确的整数。我以后怎么能看到这样的东西?我能保留吗n使用上面代码中的第一个定义基本情况?@limonade这现在更多的是数学而不是代码。无论如何……forumlas是等价的,如果你总是从一个中得到一个整数,那么你也从其他的中得到一个整数;)@limonade第一个定义不是递归的,你不需要基本情况了。真的非常感谢你!你知道吗在这个特殊的程序中,即使在函数中,我也要保留n和k?@limonade是的。如果不是大多数的话,很多错误都可以通过正确命名来避免。好的,我没有看到二项式系数的第一个定义总是提供一个正确的整数。我以后怎么能看到这样的东西?当我第一个定义是我在上面代码中的基本情况吗?@limonade这现在更多的是数学而不是代码。无论如何……forumlas是等价的,如果你总是从一个得到一个整数,你也从其他得到一个整数;)@limonade第一个定义不是递归的,你不需要基本情况