c++ - 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);
}
我的主管认为由于模板的原因它不起作用。有谁知道修复?
解决方案
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);
推荐阅读
- python - django 上的 CharField 输出为 (
,) - reporting-services - 如何在 Microsoft Report Builder 中修改雷达图中类别标签的字体?
- sql - 计算用户在多个表中创建的记录
- c# - dotnet Web 服务和测试:由于已使用基础,因此无法移除基础
- sql-server - 是否可以从 CDN 链接字体并在 SSRS 报告中使用它?
- javascript - 如何动态更改背景图像?
- html - 显示不适用于滑块的单选按钮
- mysql - 这是关于在 sql 中添加约束
- javascript - 在渲染函数中抛出 Promise 的 React 官方立场是什么?
- sql - 在 SQL Oracle 中计算单词