C++递归函数,调用当前深度

C++ recursive function, calling current depth

本文关键字:深度 调用 递归函数 C++      更新时间:2023-10-16

我正在编写一个函数,用于使用梯形规则递归计算积分。对于区间(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 实例?这样,您的代码应该运行得更快。