【发布时间】:2021-10-10 23:44:35
【问题描述】:
目前,我正在使用 C++ 开发一个递归函数,该函数需要传递一个大数组和几个常量变量。这是递归的结构:
void recurse_objects(std::vector<Object> &objects, int i, int j, double merge_distance, double size_enclosure, double timestep){
//operations performed
//recursion performed
if(j+1 < objects.size()){
recurse_objects(objects, i, j+1, merge_distance, size_enclosure, timestep);
}else if(i+2 < objects.size()){
recurse_objects(objects, i+1, i+2, merge_distance, size_enclosure, timestep);
}
//more operations performed
}
该函数通过每个唯一的对象对 (i, j) 递归。问题是,在我正在处理的对象数量(500-2000 个对象)中,由于堆栈填满,函数分段错误 - 它适用于 350 个以下的对象。
感觉如果我可以将数组和常量变量存储在其他地方,我可以节省空间并能够在最后几个对象上运行计算。这个问题有一个通用的解决方法吗?我唯一能想到的是使用全局变量——这是不可行的,因为值是由系统输入决定的,批处理,这会完全降低效率,或者只是将程序更改为非递归程序。
【问题讨论】:
-
矢量引用中的对象已经存储在别处。加倍如此。首先是因为向量使用动态内存,其次是因为只有一个向量,其引用是递归传递的。
-
而真正的解决方案是使用迭代解决方案而不是递归解决方案
-
我的经验表明,递归函数的调用深度应与 O(log n) 最大值成正比。像分治或树遍历算法。如果深度在O(n),很容易发生栈溢出,但算法一般可以转化为循环。
-
听起来我将不得不使用迭代 - 这个项目的目标是缓存优化,这是我想尝试递归的唯一原因(除了看起来更干净)。谢谢大家
标签: c++ recursion optimization