首页 > 解决方案 > C++ 中的递归和模板

问题描述

我尝试使用切线模式计算导数。我尝试使用递归来实现它。我遇到了以下问题:我得到了一个可以永远编译的模板的递归。

template <typename T>
void dern(int n, const T &x, T &dy)
{
  using DCO_T = typename dco::gt1s<T>::type;
  DCO_T _x, _y;
  dco::value(_x) = x;
  dco::derivative(_x) = 1;
  if (n > 1)
  {
    dern(--n, _x, _y);
  }
  else
  {
    f(_x, _y);
  }
  dy = dco::derivative(_y);
}

如果我尝试将它们写出来,它会很好地工作:

template <typename T>
void der1(const T &x, T &dy)
{
  using DCO_T = typename dco::gt1s<T>::type;
  DCO_T _x, _y;
  dco::value(_x) = x;
  dco::derivative(_x) = 1;
  f(_x, _y);
  dy = dco::derivative(_y);
}

template <typename T>
void der2(const T &x, T &dy)
{
  using DCO_T = typename dco::gt1s<T>::type;
  DCO_T _x, _y;
  dco::value(_x) = x;
  dco::derivative(_x) = 1;
  der1(_x, _y);
  dy = dco::derivative(_y);
}

template <typename T>
void der3(const T &x, T &dy)
{
  using DCO_T = typename dco::gt1s<T>::type;
  DCO_T _x, _y;
  dco::value(_x) = x;
  dco::derivative(_x) = 1;
  der2(_x, _y);
  dy = dco::derivative(_y);
}

template <typename T>
void der4(const T &x, T &dy)
{
  using DCO_T = typename dco::gt1s<T>::type;
  DCO_T _x, _y;
  dco::value(_x) = x;
  dco::derivative(_x) = 1;
  der3(_x, _y);
  dy = dco::derivative(_y);
}

我的主管认为由于模板的原因它不起作用。有谁知道修复?

标签: c++templatesrecursion

解决方案


n应该是作为模板参数传递的编译时参数。

template <int n, typename T>
void dern(const T &x, T &dy)
{
  using DCO_T = typename dco::gt1s<T>::type;
  DCO_T _x, _y;
  dco::value(_x) = x;
  dco::derivative(_x) = 1;
  if constexpr (n > 1) {
    dern<n - 1>(_x, _y);
  } else {
    f(_x, _y);
  }
  dy = dco::derivative(_y);
}

编译时递归不能依赖于运行时变量。

调用它,例如

dern<4>(x, y);

推荐阅读