За 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
является целым числом
Да, вам нужно перевести свою математически индексированную функцию в функцию с 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;
}
Вы написали:
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
функция с пользовательским вводом.