0

此函数适用于较小的数组。但是,当给定非常大的“int”数组时,它会惨遭失败。我查找并发现它的堆栈内存不足导致了问题,因为它无法分配足够的空间来容纳所有内部循环的变量。那么如何解决这个问题呢?

void subsetSums(vector<int> arr, int l, int r, int sum=0) { 
    if(l > r){
        cout << sum << ", ";
        return;
    }
    subsetSums(arr, l+1, r, sum+arr[l]);
    subsetSums(arr, l+1, r, sum);

}
    int main(){
    vector<int> arr(500000, 1);
    subsetSums(arr, 0, arr.size()-1);
    return 0;
}

我现在只想“热修复”这个。然后,也许我会找到这个问题的最佳解决方案。

4

1 回答 1

0

你可以做三件不同的事情:

  1. 减少堆栈使用

不用为每个函数调用传递向量和“r”的副本,当它们根本不改变时,您可以创建一个将这些作为成员的结构,并将对该结构的引用作为参数传递。如果你不怕全局变量,你可以让这些变量成为全局变量,而不是把它们作为函数参数传递,尽管在这种情况下风格警察可能会来把你带走。

同样在某些编译器上,未优化或调试构建将使用更多堆栈,因此请尝试发布构建目标或打开优化。

  1. 增加堆栈大小

执行此操作的方式取决于编译器和平台。以下是使用 gcc 和 linux 的方法:Change stack size for a C++ application in Linux during compilation with GNU compiler

  1. 更改为非递归算法

通常有一种更快、内存效率更高的算法来做与递归算法相同的事情。在这种情况下是显而易见的。这通常是在实际生产代码中要做的事情。

于 2019-07-23T03:59:30.873 回答