C++递归函数,调用当前深度
C++ recursive function, calling current depth
我正在编写一个函数,用于使用梯形规则递归计算积分。对于区间(a,b)上的一些f(x),方法是计算边(b-a)的大梯形的面积,然后将其与将区间分成n个部分后形成的小梯形之和进行比较。如果差值大于某个给定误差,则为每个小梯形再次调用该函数,并对结果求和。如果差值较小,则返回两个值的算术平均值。
该函数采用两个参数,一个是指向要集成的函数的函数指针,另一个是对辅助结构的常量引用,其中包含诸如间隔 (a,b)、分区量等信息:
struct Config{
double min,max;
int partitions;
double precision;
};
当我想在每次迭代中更改分区数量时,就会出现问题,目前我们假设只是递增一。我认为如果不调用当前的复发深度,就无法做到这一点:
integrate(const Config &conf, funptr f){
double a=conf.min,b=conf.max;
int n=conf.partitions;
//calculating the trapezoid areas here
if(std::abs(bigTrapezoid-sumOfSmallTrapezoids) > conf.precision){
double s=0.;
Config configs = new Config[n];
int newpartitions = n+(calls);
for(int i=0; i < n;++i){
configs[i]={ a+i*(b-a)/n , a+(i+1)*(b-a)/n , newpartitions};
s+=integrate(configs[i],f);
}
delete [] configs;
return s; }
else{
return 0.5*(bigTrapezoid+sumOfSmallTrapezoids);}
}
我在这里缺少的部分当然是一种查找(调用)的方法。我尝试过做类似于这个答案的事情,但它不起作用,实际上它会冻结 PC,直到 makefile 杀死进程。但也许我做错了。我不想向函数添加额外的参数或向结构添加额外的变量。我应该怎么做?
您无法"找到"calls
,但您绝对可以自己传递它,如下所示:
integrate(const Config &conf, funptr f, int calls=0) {
...
s+=integrate(configs[i],f, calls+1);
...
}
,'int newpartitions = n + 1;'就足够了,不是吗?在每个递归级别,分区数增加 1。假设 conf.partitions 从 1 开始。如果例程需要递归新级别,则 newpartitions 为 2,您将构建 2 个新的 Config 实例,每个实例都以"2"作为分区的值。再往下递归,newpartitions 是 3,你构建了 3 个配置,每个配置都有"3"作为"分区",依此类推。
这里的诀窍是确保您的代码足够健壮以避免无限递归。
顺便说一句,对我来说,对循环后必须销毁的 Config 实例使用动态分配似乎效率低下。为什么不在循环内的堆栈上构建单个 Config 实例?这样,您的代码应该运行得更快。
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 提升图:当我的图使用 listS 作为 VertexList 时,如何调用深度优先搜索()?
- 如何通过调用 gluUnproject 两次(不使用 gluUnProject)从场景坐标中获取深度值
- C++递归函数,调用当前深度
- 在openGL中进行draw调用,只触及深度缓冲区
- 为什么赋值操作符用于深度复制,谁调用它
- 如何处理(深度)嵌套函数调用中的默认值
- 如何在Android的崩溃转储中获得更多的调用堆栈深度?