1

我正在编写一个置换函数,它从 n 参数创建一个整数向量,并使用递归将它们交错。我遇到了分段错误,但在尝试让它工作时遇到了很多麻烦。这是我的代码:

void print(const vector<int>& v) 
{
    for (auto it = v.begin(); it != v.end(); ++it) 
    {
        cout << *it << ' ';
    }

    cout << endl;
}

vector<vector<int> > interleave(int x, const vector<int>& v) 
{
    size_t i;
    vector<vector<int> > results;

    for (i=0;i<=v.size();i++) 
    {
        vector<int> temp(v); 

        temp.insert(temp.begin()+i, x);
        results.push_back(temp);
    }

    return results;
}

vector<vector<int> > permute(size_t n) 
{
    size_t i, j;
    vector<vector<int> > v;
    auto vectors = permute(n-1);
    vector<vector<int> > results;
    for (j=0;vectors.size();j++) 
    {
        for (i=1;i<=n-1;i++) 
        {
            vectors[j].push_back(i);
        }
    }

    for (j=0;j<=vectors.size();j++) 
    {
        for (i=1;i<=n-1;i++) 
        {
            vector<vector<int> > temp = interleave(i,vectors[j]);
            results.insert(results.end(), temp.begin(), temp.end());
        }
    }

    return results;
}

int main(void) 
{
    size_t i;
    vector<vector<int> > results = permute(3);
    for (i=0;i<results.size();i++) 
    {
        print(results[i]);      
    }
}
4

1 回答 1

3

permute() 是无限递归的:它总是调用 permute(n-1)。最终这会导致堆栈溢出 - 不知道为什么会出现分段错误(可能代码还有其他问题)。

还:

for (j=0;vectors.size();j++) {

永远不会退出。你可能的意思是:

for (j=0;j<vectors.size();j++) {

注意 < 与 <=。如果 j=vectors.size(),vectors[j] 正在访问越界的项目。

于 2016-06-22T21:33:17.383 回答