Полиномиальный коэффициент кода всегда дает один и тот же ответ - PullRequest
0 голосов
/ 08 июня 2018

Я написал следующий код, чтобы найти коэффициент многочлена, однако всегда остается один и тот же ответ, 2.122e-314.Я сидел на этом некоторое время, и не могу найти то, что не хватает.Мы должны делать это с помощью рекурсий.Мой код выглядит следующим образом:

#include<iostream>
#include<vector>
#include<cerrno>
#include<cstring>

using namespace std;

double binom(int n,int a)
{
double b;
double i;
for (b = 1, i = 1;i <= a; ++i, --n)
        b *= n/i;
return b;
}

double multi(int n, vector<int> a)
{
double b;
int s1 = n;
for ( int s1 = n, b = 1, i = 0; i <= a.size(); ++i, s1 = s1 - a[i-1] )
    b *= binom(s1, a[i]);
return b;
}



int main()
{
int n, k; 
cout << "dimension k: ";
cin >> k;
vector<int> a(k);
cout << "n: ";
cin >> n;
cout << "a[0],...,a[k-1]: ";
for (int i = 0; i < k; ++i)
cin >> a[i];
cout << "Multinomialcoefficient: " << multi(n,a) << endl;
return 0;
}

Любая помощь с благодарностью.

1 Ответ

0 голосов
/ 08 июня 2018

Задача 1

Вы выполняете целочисленные деления в строке

  b *= n/i;

Измените его на

  b *= 1.0*n/i;

Задача 2

Этоковарная проблема.

double b;
int s1 = n;
for ( int s1 = n, b = 1, i = 0; i <= a.size(); ++i, s1 = s1 - a[i-1] )
  b *= binom(s1, a[i]);
return b;

b в цикле, где вы используете b = 1, к сожалению, не то же самое b, объявленное в начале функции.Поскольку вы используете int s1 = n, b = 1,, b в цикле представляет собой отдельную переменную типа int, определенную в области действия цикла.Следовательно, b, объявленный в верхней части функции, неинициализирован, и это тот, который вы возвращаете из функции.

Повышение уровня предупреждения вашего компилятора могло бы выявить эту проблему.С g++ -Wall я получаю следующее предупреждение.

socc.cc:23:11: warning: ‘b’ is used uninitialized in this function [-Wuninitialized]
    return b;

       ^

Измените эту функцию на:

double multi(int n, vector<int> a)
{
   // Initialize all the variables. Then, the init part of the loop can be empty.
   double b = 1;
   int s1 = n;
   int i = 0;

   for ( ; i <= a.size(); ++i, s1 = s1 - a[i-1] )
      b *= binom(s1, a[i]);
   return b;
}
...