首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用std::堆栈将Hermite多项式递归转化为解

用std::堆栈将Hermite多项式递归转化为解
EN

Stack Overflow用户
提问于 2021-08-03 19:35:54
回答 2查看 107关注 0票数 1

Hermite多项式由下列公式定义,其中n>0和x是实数:

我已经使用递归定义了一个解决方案:

代码语言:javascript
复制
int hermitPolynomial(int n, int x){
    if(n == 0){
        return 1;
    }
    if (n == 1){
        return x*2;
    }
    return 2*x*hermitPolynomial(n-1,x) + 2*(n-1)*hermitPolynomial(n-2,x);
} 

如何使用堆栈将函数转换为迭代解决方案?另外,使用堆栈将递归转换为迭代函数的基础是什么?

我设法将难度较小的递归(如Fibonacci)转换为迭代堆栈解决方案。

这是我尝试过的解决方案,但我没有想到一种跟踪"2x“和”2(n-1)“的方法:

代码语言:javascript
复制
int hermitPolynomialIter(int n, int x){
    std::stack<int> s;
    int result = 0;
    s.push(n);
    while(!s.empty()){
        int temp = s.top(); s.pop();
        if(temp == 1){
            result+=1;
        }
        else if(temp == 2){
            result+=2*x;
        }
        else{
            s.push(temp-1);
            s.push(temp-2);
        }
    }
    return result;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-03 20:19:11

首先,让我注意到递推公式

代码语言:javascript
复制
H_n(x) = 2xH_{n-1}(x) - 2(n-1)H_{n-2}(x)

(注意减号)。

这是一个解决方案,连同计算x=1和x=2上的第一个多项式的一个小测试。

代码语言:javascript
复制
#include <stack>
#include <iostream>

int hermitePolynomial(int n, int x)
{
  std::stack<int> s;
  if (n == 0)
    {
      return 1;
    }
  else if (n == 1)
    {
      return 2 * x;
    }
  else
    {
      s.push(1);
      s.push(2 * x);
      for (int k = 2; k <= n; ++k)
    {
      auto hermite_k_minus_1 = s.top();
      s.pop();
      auto hermite_k_minus_2 = s.top();
      s.pop();
      auto hermite_k = 2 * x * hermite_k_minus_1 - 2 * (k - 1) * hermite_k_minus_2;
      s.push(hermite_k_minus_1);
      s.push(hermite_k);
    }
      return s.top();
    }
}

int main()
{
  for (const int x : { 1, 2 })
    {
      std::cout << "Polynomials at x = " << x << std::endl;
      for (int i = 0; i < 5; ++i)
    std::cout << "H_" << i << "(" << x << ") = " << hermitePolynomial(i, x) << std::endl;
    }

  return 0;
}

看吧,住在Coliru

其主要思想是在循环上迭代计算k-多项式,并在堆栈中保留2个最后多项式,即指数k-1和k-2的多项式。

票数 1
EN

Stack Overflow用户

发布于 2021-08-03 20:07:56

提示:

注意,递归公式将Hn表示为前面的两个计算(即Hn-1Hn-2)。因此,您可以只使用保存这些评估的两个变量(让H1H2)来执行它,并在增加n时转移它们。

循环体读取

代码语言:javascript
复制
H0= 2 * X * H1 + 2 * (N-1) * H2;
H2= H1;
H1= H0;
N++;

以下不变量将保持不变:H1 = Hn-1 and H2 = Hn-2,用于所有迭代。

我让您了解如何初始化变量H0H1H2 (考虑N=2)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68641883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档