【问题标题】:How to write a function for Hermite polynomials?如何为 Hermite 多项式编写函数?
【发布时间】:2019-05-07 08:08:45
【问题描述】:

对于用户输入的2个数字xn,我的代码需要找到由以下公式递归定义的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) 中的两个参数有点困惑,其中nH 的索引,而x 是一个整数。

【问题讨论】:

  • 这个H(n) 不是你调用带有两个参数的函数的方式,这个H1[n] 也不是你调用函数的方式。首先为变量和函数指定不同的名称,您的代码非常混乱
  • int *H1 = new int[n + 1]; -- 1) 内存泄漏。 2)混淆命名变量与函数名相同。
  • @user463035818,是的,这令人困惑,我对此表示歉意,因为我对函数完全陌生。
  • 罗马不是一天建成的。从一个在屏幕上打印其参数的函数开始,或者像这样简单

标签: c++ function recursion iteration


【解决方案1】:

是的,您需要将您的 matematic 索引函数转换为具有 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; 
}

Online demo

【讨论】:

    【解决方案2】:

    你写道:

    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);
        }
    }
    

    诀窍部分是实现比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); 中的n 不一样,它们相差一个。

    现在,您只需要处理用户 I/O 并使用用户输入调用您的 H 函数。

    【讨论】:

    • 2*(n-1)*H(n-2, x) :-)
    • 原来是H_{n+1}(x) = 2x H_n(x) - 2n H_{n - 1}(x)。但是我们将n 下移了 1... 这样就变成了H_{n}(x) = 2x H_(n - 1)(x) - 2(n - 1) H_(n - 2)(x)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    相关资源
    最近更新 更多