Я пишу перестановочную функцию, которая создает вектор целых из параметра 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]);
}
}
permute () бесконечно рекурсивен: он всегда будет вызывать permute (n-1). В конечном итоге это может привести к переполнению стека — не уверен, почему вы получаете ошибку сегментации (возможно, есть другие проблемы с кодом).
Также:
for (j=0;vectors.size();j++) {
никогда не выйдет. Вы, вероятно, имели в виду:
for (j=0;j<vectors.size();j++) {
Обратите внимание < против <знак равно Если j = vectors.size (), векторы [j] обращаются к элементам за пределами.
Других решений пока нет …