Как отмечено в interjay * answer , отправленный код неправильно учитывает различия в размерах вектора.
Чтобы сделатьсравнение индексов легче (по крайней мере, ИМХО, но это также должно помочь в дальнейших вычислениях с использованием этих коэффициентов), я бы сохранял коэффициенты в обратном порядке. Я бы также воспользовался их конкретным шаблоном (только нечетные или , четные отличны от нуля).
Возможно, стоит упомянуть, что рекурсивный подход такого типабудет неэффективным, когда применяется к большим векторам.
Тем не менее, это возможная реализация:
std::vector<double> Legendre_coefficients(int m)
{
if (m == 0)
{
return {1};
}
if (m == 1)
{
return {0, 1};
}
// Initialize with zero, only at most (half + 1) of the terms will be changed later
std::vector<double> coeffs(m + 1);
// Consider some form of memoization instead of this recursion
std::vector<double> v = Legendre_coefficients(m - 1);
std::vector<double> u = Legendre_coefficients(m - 2);
// using literals of floating point type, 'm' is promoted by the compiler
double a = (2.0 * m - 1.0) / m;
double b = (m - 1.0) / m;
int first = 1;
// If 'm' is even, so is (m - 2) and its first element is zero. It can be skipped.
// It also avoids annoying '-0' in the output
if ( m % 2 == 0 )
{
coeffs[0] = -b * u[0];
first = 2;
}
for (int i = first; i < m - 1; i += 2)
{
coeffs[i] = (a * v[i - 1] - b * u[i]);
}
coeffs[m] = a * v[m - 1];
return coeffs;
}
Testable здесь .