рекурсия — перевод кода с PASCAL на C ++, дающий неожиданные результаты

Я пытаюсь реализовать код PASCAL, указанный в Эта бумага в C ++ и моя попытка

#include <iostream>
using namespace std;

int GenFact(int a, int b)
{                               // calculates the generalised factorial
// (a)(a-1)...(a-b+1)
int gf = 1;
for (int jj = (a - b + 1); jj < a + 1; jj++)
{
gf = gf * jj;
}
return (gf);
}                               // end of GenFact function

double GramPoly(int i, int m, int k, int s)
{                               // Calculates the Gram Polynomial ( s = 0 ),
// or its s'th
// derivative evaluated at i, order k, over 2m + 1 points

double gp_val;

if (k > 0)
{
gp_val = (4.0 * k - 2.0) / (k * (2.0 * m - k + 1.0)) *
(i * GramPoly(i, m, k - 1, s) +
s * GramPoly(i, m, k - 1.0, s - 1.0)) -
((k - 1.0) * (2.0 * m + k)) /
(k * (2.0 * m - k + 1.0)) *
GramPoly(i, m, k - 2.0, s);
}
else
{
if ((k == 0) && (s == 0))
{
gp_val = 1.0;
}
else
{
gp_val = 0.0;
}                       // end of if k = 0 & s = 0
}                           // end of if k > 0

return (gp_val);

}                               // end of GramPoly function

double Weight(int i, int t, int m, int n, int s)
{                               // calculates the weight of the i'th data
// point for the t'th Least-square
// point of the s'th derivative, over 2m + 1 points, order n

double sum = 0.0;

for (int k = 0; k < n + 1; k++)
{
sum += (2.0 * k + 1.0) *
GenFact(2.0 * m + k + 1.0, k + 1.0) *
GramPoly(i, m, k, 0) * GramPoly(t, m, k, s);
}                           // end of for loop

return (sum);

}                               // end of Weight function

int main()
{
double z;
z = Weight(-2, -2, 2, 2, 0);
cout << "The result is " << z;
return 0;
}

однако, когда я запускаю код, на выходе получается 1145, в то время как я ожидаю, что 31/35 = 0,88571 согласно уравнению 12 и таблицам, приведенным в статье. Где моя ошибка?

0

Решение

Ваш Weight функция неверна — отсутствует термин … попробуйте этот:

double Weight( int i , int t , int m , int n , int s )
{ // calculates the weight of the i'th data point for the t'th Least-square
// point of the s'th derivative, over 2m + 1 points, order n

double sum = 0.0 ;
for ( int k = 0 ; k <= n ; k++ )
{
sum += (2*k+1) *
(
GenFact(2*m,k) /          //<-- here
GenFact(2*m+k+1,k+1)
) * GramPoly(i,m,k,0) * GramPoly(t,m,k,s) ;

} // end of for loop
return ( sum ) ;

} // end of Weight function
1

Другие решения

Первая функция GenFact следует вернуть float или же double вместо int, Следовательно gf тоже должен иметь тип с плавающей точкой.

Вторая ваша функция Weight это не то же самое, что в статье. Я думаю, что вы пропустили часть GenFact(2 * m, k)

1

В дополнение к предыдущему ответу — вы должны разделить на GenFact(2.0 * m + k + 1.0, k + 1.0), а не умножать (по крайней мере, так говорится в статье).

1
По вопросам рекламы [email protected]