Как написать функцию для полиномов Эрмита? - PullRequest
0 голосов
/ 05 декабря 2018

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

Or click here

Я пытаюсь реализовать рекурсивную версию и итеративную версию этой функции.Но я думаю, что я неправильно понимаю это, поскольку мой код не компилируется из-за ошибок в 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 - этоцелое число.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Вы писали:

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 голосов
/ 05 декабря 2018

Да, вам нужно перевести свою математически индексированную функцию в функцию с 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; 
}

Демо онлайн

...