CPP - биномиальный коэффициент - я получаю неправильные результаты - PullRequest
0 голосов
/ 15 января 2020

Задача: Напишите и протестируйте функцию 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;
}

Три определения биномиального коэффициента даны: Three Definitions of Binomial Coefficient

1 Ответ

2 голосов
/ 15 января 2020

У вас неправильный второй случай

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);
}

Формула гласит "если n = k или k = 0" и в вашем коде a == n и b == k, поэтому вторая строка должна быть

else if(a == b || b == 0 ) return 1;

Обратите внимание, что лучшее именование могло бы предотвратить эту ошибку.

PS

Почему бы не другие определения биномиального коэффициента?

Ваши рассуждения верны для последнего определения, но не во-первых. Результатом всегда является целое число, поэтому знаменатель и знаменатель всегда таковы, что вы можете выполнить деление с использованием целочисленной арифметики. Вы скорее столкнетесь с проблемой получения ненужных огромных терминов для факториала.

...