Как написать функцию для полиномов Эрмита?

За 2 номера x а также n введенный пользователем, мой код должен найти Hn (x), рекурсивно определенный по следующим формулам:

Или нажмите здесь

Я пытаюсь реализовать рекурсивную версию и итеративную версию этой функции. Но я думаю, что я получаю неправильное представление об этом, так как мой код не компилируется из-за ошибок в H (n) и H [n]:

#include "pch.h"#include <iostream>

int H(int n, int x)   //function for recursion
{
if (n < 0) return -1;
else if (n == 0) return 1;
else if (n == 1) return 2 * x;
return 2 * x * H(n) * x - 2 * n * H(n - 1) * x;
}

int H1(int n, int x) //function for Iterator
{
int *H1 = new int[n + 1];

H[0] * x = 1;
H[1] * x = 2 * x;

for (int i = 0; i <= n; i++)
{
H[i] * x = 2 * x * H[n] * x - 2 * n * H[n - 1] * x;

}
return H1(n) * x;
}

int main()
{
int n, x;
std::cout << "Enter the number n: ";
std::cin >> n;
std::cout << "Enter the number x: ";
std::cin >> x;

std::cout << "Rec = " << H[n] * x std::endl;
std::cout << "Iter = " << H1[n] * x std::endl;
}

Это сбивает с толку, я прошу прощения за это, так как я совершенно не знаком с функциями.

Мне уже удалось сделать это с помощью последовательности Фибоначчи. И там я использовал только один параметр для функции f(x) то есть f(int n){... }, но тут меня немного смущают два параметра в функции H(int n, int x) , где n это индекс H в то время как x является целым числом

0

Решение

Да, вам нужно перевести свою математически индексированную функцию в функцию с 2 параметрами.

Рекурсивная версия почти в порядке, за исключением некоторых сдвигов в индексах:

int H(int n, int x)   // recursive version
{
if (n <= 0)
return -1;
else if (n == 1)
return 1;
else if (n == 2)
return 2 * x;
else
return 2 * x * H(n-1, x) - 2 * n * H(n - 2, x); // shift n+1, n n-1 to n, n-1 n-2
}

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

int Hi(int n, int x) //iterative version
{
if (n <= 0)
return -1;
else if (n == 1)
return 1;

int am2 = 1;      // start for for n-2
int am1 = 2*x;    // start for n-1
if (n == 2)
return am1;

int am;
for (int i=3; i<=n; i++) {
am = 2*x*am1 -  2*i*am2;   // calculate Hn from Hn-1 and Hn-2
//prepare next interation
am2=am1;
am1=am;
}
return am;
}

Онлайн демо

0

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

Вы написали:

int H(int n, int x)   //function for recursion
{
if (n < 0) return -1;
else if (n == 0) return 1;
else if (n == 1) return 2 * x;
return 2 * x * H(n) * x - 2 * n * H(n - 1) * x;
}

Вы недалеко от рабочей программы. Брось это H1 функция. Посмотрим:

int H(int n, int x)
{
switch(n)
{
// H_0(x) = 1
case 0: return 1;
// H_1(x) = 2x
case 1: return 2 * x;
// H_{n+1}(x) = 2x H_n(x) - 2n H_{n - 1}(x)
default:
return 2*x*H(n-1, x) - 2*(n-1)*H(n-2, x);
}
}

Часть трюка понимает, чем n в H_{n+1}(x) = 2x H_n(x) - 2n H_{n - 1}(x) И в return 2*x*H(n-1, x) - 2*(n-1)*H(n-2, x);не одинаковы, они отличаются на одно.

Теперь вам нужно только обработать пользовательский ввод-вывод и вызвать H функция с пользовательским вводом.

0

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